Module jumpscale.packages.backup.services.system_backup
THE SYSTEM BACKUP SERVICE
this service will run in the background and execute a backup job for the system paths every hour
Examples:
run the backup service jobs once manually
JS-NG> j.packages.backup.SystemBackupService().job()
adding the backup service manually to the servicemanager, although this would done automatically when threebot start
JS-NG> service_manager = j.tools.servicemanager.new('system_backup_service')
JS-NG> service_manager.add_service('system_backup_service', j.sals.fs.expanduser('~/projects/js-sdk//jumpscale/packages/backup/services/system_backup.py'))
for how to create a backup jobs, check backupjob sal docs
Expand source code
"""
----------------------------------------------------------------------
# THE SYSTEM BACKUP SERVICE
----------------------------------------------------------------------
this service will run in the background and execute a backup job for the system paths every hour
Examples:
## run the backup service jobs once manually
JS-NG> j.packages.backup.SystemBackupService().job()
## adding the backup service manually to the servicemanager, although this would done automatically when threebot start
```python
JS-NG> service_manager = j.tools.servicemanager.new('system_backup_service')
JS-NG> service_manager.add_service('system_backup_service', j.sals.fs.expanduser('~/projects/js-sdk//jumpscale/packages/backup/services/system_backup.py'))
```
## for how to create a backup jobs, check backupjob sal docs
"""
from jumpscale.loader import j
from jumpscale.tools.servicemanager.servicemanager import BackgroundService
from jumpscale.tools.notificationsqueue.queue import LEVEL
class SystemBackupService(BackgroundService):
# we will use this pre defined BackupJop if exists, else we will define it using the info from next section
BACKUP_JOB_NAME = "systembackupjob"
# system BackupJob info
## this ResticRepo instance must be preconfigured and exist.
RESTIC_CLIENT_NAMES = ["systembackupclient"]
## paths to include in the BackupJob
BACKUP_JOB_PATHS = ["~/.config/jumpscale/", "~/sandbox/cfg/", "~/.ssh/"]
## paths to exclude. absolute paths will not work as the exclude path should be inside one of the specified backup paths.
PATHS_TO_EXCLUDE = [".config/jumpscale/logs"]
def __init__(self, interval=60 * 60, *args, **kwargs):
super().__init__(interval, *args, **kwargs)
@classmethod
def _create_system_backup_job(cls):
repos_are_ready = all([client in j.tools.restic.list_all() for client in cls.RESTIC_CLIENT_NAMES])
if repos_are_ready:
backupjob = j.sals.backupjob.new(
cls.BACKUP_JOB_NAME,
clients=cls.RESTIC_CLIENT_NAMES,
paths=cls.BACKUP_JOB_PATHS,
paths_to_exclude=cls.PATHS_TO_EXCLUDE,
)
backupjob.save()
return True
else:
return False
def job(self):
"""Background backup job to be scheduled.
"""
j.logger.info(f"[Backup Package - System Backup Service] Backup job {self.BACKUP_JOB_NAME} started.")
if self.BACKUP_JOB_NAME not in j.sals.backupjob.list_all():
j.logger.warning(
f"[Backup Package - System Backup Service] couldn't get instance of BackupJob with name {self.BACKUP_JOB_NAME}!"
)
if not SystemBackupService._create_system_backup_job():
j.logger.error(
f"[Backup Package - System Backup Service] There is no preconfigure restic repo/s. Backup job won't executed!"
)
return
j.logger.info(
f"[Backup Package - System Backup Service] {self.BACKUP_JOB_NAME} job successfully created\npaths to backup: {self.BACKUP_JOB_PATHS}\npaths excluded: {self.PATHS_TO_EXCLUDE}."
)
backupjob = j.sals.backupjob.get(self.BACKUP_JOB_NAME)
job_completed = backupjob.execute(block=True)
if job_completed:
j.logger.info(
f"[Backup Package - System Backup Service] Backup job {self.BACKUP_JOB_NAME} completed successfully."
)
j.tools.notificationsqueue.push(
f"the System backup job completed successfully.", category="SystemBackupService", level=LEVEL.INFO
)
else:
j.logger.error(f"[Backup Package - System Backup Service] Backup job {self.BACKUP_JOB_NAME} failed.")
j.tools.notificationsqueue.push(
f"the System backup job failed.", category="SystemBackupService", level=LEVEL.ERROR
)
service = SystemBackupService()
Classes
class SystemBackupService (interval=3600, *args, **kwargs)
-
Helper class that provides a standard way to create an ABC using inheritance.
Abstract base class for background services managed by the service manager
Arguments
interval (int | CronTab object | str): scheduled job is executed every interval in seconds / CronTab object / CronTab-formatted string
Expand source code
class SystemBackupService(BackgroundService): # we will use this pre defined BackupJop if exists, else we will define it using the info from next section BACKUP_JOB_NAME = "systembackupjob" # system BackupJob info ## this ResticRepo instance must be preconfigured and exist. RESTIC_CLIENT_NAMES = ["systembackupclient"] ## paths to include in the BackupJob BACKUP_JOB_PATHS = ["~/.config/jumpscale/", "~/sandbox/cfg/", "~/.ssh/"] ## paths to exclude. absolute paths will not work as the exclude path should be inside one of the specified backup paths. PATHS_TO_EXCLUDE = [".config/jumpscale/logs"] def __init__(self, interval=60 * 60, *args, **kwargs): super().__init__(interval, *args, **kwargs) @classmethod def _create_system_backup_job(cls): repos_are_ready = all([client in j.tools.restic.list_all() for client in cls.RESTIC_CLIENT_NAMES]) if repos_are_ready: backupjob = j.sals.backupjob.new( cls.BACKUP_JOB_NAME, clients=cls.RESTIC_CLIENT_NAMES, paths=cls.BACKUP_JOB_PATHS, paths_to_exclude=cls.PATHS_TO_EXCLUDE, ) backupjob.save() return True else: return False def job(self): """Background backup job to be scheduled. """ j.logger.info(f"[Backup Package - System Backup Service] Backup job {self.BACKUP_JOB_NAME} started.") if self.BACKUP_JOB_NAME not in j.sals.backupjob.list_all(): j.logger.warning( f"[Backup Package - System Backup Service] couldn't get instance of BackupJob with name {self.BACKUP_JOB_NAME}!" ) if not SystemBackupService._create_system_backup_job(): j.logger.error( f"[Backup Package - System Backup Service] There is no preconfigure restic repo/s. Backup job won't executed!" ) return j.logger.info( f"[Backup Package - System Backup Service] {self.BACKUP_JOB_NAME} job successfully created\npaths to backup: {self.BACKUP_JOB_PATHS}\npaths excluded: {self.PATHS_TO_EXCLUDE}." ) backupjob = j.sals.backupjob.get(self.BACKUP_JOB_NAME) job_completed = backupjob.execute(block=True) if job_completed: j.logger.info( f"[Backup Package - System Backup Service] Backup job {self.BACKUP_JOB_NAME} completed successfully." ) j.tools.notificationsqueue.push( f"the System backup job completed successfully.", category="SystemBackupService", level=LEVEL.INFO ) else: j.logger.error(f"[Backup Package - System Backup Service] Backup job {self.BACKUP_JOB_NAME} failed.") j.tools.notificationsqueue.push( f"the System backup job failed.", category="SystemBackupService", level=LEVEL.ERROR )
Ancestors
- BackgroundService
- abc.ABC
Class variables
var BACKUP_JOB_NAME
var BACKUP_JOB_PATHS
var PATHS_TO_EXCLUDE
var RESTIC_CLIENT_NAMES
Methods
def job(self)
-
Background backup job to be scheduled.
Expand source code
def job(self): """Background backup job to be scheduled. """ j.logger.info(f"[Backup Package - System Backup Service] Backup job {self.BACKUP_JOB_NAME} started.") if self.BACKUP_JOB_NAME not in j.sals.backupjob.list_all(): j.logger.warning( f"[Backup Package - System Backup Service] couldn't get instance of BackupJob with name {self.BACKUP_JOB_NAME}!" ) if not SystemBackupService._create_system_backup_job(): j.logger.error( f"[Backup Package - System Backup Service] There is no preconfigure restic repo/s. Backup job won't executed!" ) return j.logger.info( f"[Backup Package - System Backup Service] {self.BACKUP_JOB_NAME} job successfully created\npaths to backup: {self.BACKUP_JOB_PATHS}\npaths excluded: {self.PATHS_TO_EXCLUDE}." ) backupjob = j.sals.backupjob.get(self.BACKUP_JOB_NAME) job_completed = backupjob.execute(block=True) if job_completed: j.logger.info( f"[Backup Package - System Backup Service] Backup job {self.BACKUP_JOB_NAME} completed successfully." ) j.tools.notificationsqueue.push( f"the System backup job completed successfully.", category="SystemBackupService", level=LEVEL.INFO ) else: j.logger.error(f"[Backup Package - System Backup Service] Backup job {self.BACKUP_JOB_NAME} failed.") j.tools.notificationsqueue.push( f"the System backup job failed.", category="SystemBackupService", level=LEVEL.ERROR )