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_NAMEvar BACKUP_JOB_PATHSvar PATHS_TO_EXCLUDEvar 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 )