Schedule PlexPy database backup task

This commit is contained in:
JonnyWong16 2016-02-14 18:25:58 -08:00
parent 70325f9247
commit 5d738e58eb
3 changed files with 20 additions and 17 deletions

View file

@ -333,6 +333,8 @@ def initialize_scheduler():
schedule_job(pmsconnect.refresh_libraries, 'Refresh libraries list',
hours=hours, minutes=0, seconds=0)
schedule_job(database.make_backup, 'Backup PlexPy database', hours=6, minutes=0, seconds=0, args=(True,))
# Start scheduler
if start_jobs and len(SCHED.get_jobs()):
try:
@ -344,7 +346,7 @@ def initialize_scheduler():
#SCHED.print_jobs()
def schedule_job(function, name, hours=0, minutes=0, seconds=0):
def schedule_job(function, name, hours=0, minutes=0, seconds=0, args=None):
"""
Start scheduled job if starting or restarting plexpy.
Reschedule job if Interval Settings have changed.
@ -359,11 +361,11 @@ def schedule_job(function, name, hours=0, minutes=0, seconds=0):
logger.info("Removed background task: %s", name)
elif job.trigger.interval != datetime.timedelta(hours=hours, minutes=minutes):
SCHED.reschedule_job(name, trigger=IntervalTrigger(
hours=hours, minutes=minutes, seconds=seconds))
hours=hours, minutes=minutes, seconds=seconds), args=args)
logger.info("Re-scheduled background task: %s", name)
elif hours > 0 or minutes > 0 or seconds > 0:
SCHED.add_job(function, id=name, trigger=IntervalTrigger(
hours=hours, minutes=minutes, seconds=seconds))
hours=hours, minutes=minutes, seconds=seconds), args=args)
logger.info("Scheduled background task: %s", name)

View file

@ -64,7 +64,8 @@ SCHEDULER_LIST = ['Check GitHub for updates',
'Check for recently added items',
'Check for Plex remote access',
'Refresh users list',
'Refresh libraries list'
'Refresh libraries list',
'Refresh Plex server URLs',
'Refresh Plex server name',
'Backup PlexPy database'
]

View file

@ -47,7 +47,7 @@ def db_filename(filename="plexpy.db"):
def make_backup(cleanup=False):
""" Makes a backup of db, removes all but the last 3 backups """
""" Makes a backup of db, removes all but the last 5 backups """
backupfolder = plexpy.CONFIG.BACKUP_DIR
backup_file = 'plexpy.backup-%s.db' % int(time.time())
@ -63,22 +63,22 @@ def make_backup(cleanup=False):
db.connection.rollback()
if cleanup:
# Delete all backup files except from the last 3.
# Delete all backup files except from the last 5.
for root, dirs, files in os.walk(backupfolder):
if len(files) > 3:
all_files = [os.path.join(root, f) for f in files]
backups_sorted_on_age = sorted(all_files, key=os.path.getctime, reverse=True)
for file_ in backups_sorted_on_age[3:]:
db_files = [os.path.join(root, f) for f in files if f.endswith('.db')]
if len(db_files) > 5:
backups_sorted_on_age = sorted(db_files, key=os.path.getctime, reverse=True)
for file_ in backups_sorted_on_age[5:]:
try:
os.remove(file_)
except OSError as e:
logger.error('Failed to delete %s from the backup folder %s' % (file_, e))
logger.error(u"PlexPy Database :: Failed to delete %s from the backup folder: %s" % (file_, e))
if backup_file in os.listdir(backupfolder):
logger.debug('Successfully backup of the %s to %s in %s' % (db_filename(), backup_file, backupfolder))
logger.debug(u"PlexPy Database :: Successfully backed up %s to %s" % (db_filename(), backup_file))
return True
else:
logger.debug('Failed to make backup of %s to %s in %s' % (db_filename(), backup_file, backupfolder))
logger.warn(u"PlexPy Database :: Failed to backup %s to %s" % (db_filename(), backup_file))
return False
@ -131,15 +131,15 @@ class MonitorDatabase(object):
except sqlite3.OperationalError, e:
if "unable to open database file" in e.message or "database is locked" in e.message:
logger.warn('Database Error: %s', e)
logger.warn(u"PlexPy Database :: Database Error: %s", e)
attempts += 1
time.sleep(1)
else:
logger.error('Database error: %s', e)
logger.error(u"PlexPy Database :: Database error: %s", e)
raise
except sqlite3.DatabaseError, e:
logger.error('Fatal Error executing %s :: %s', query, e)
logger.error(u"PlexPy Database :: Fatal Error executing %s :: %s", query, e)
raise
return sql_result
@ -183,7 +183,7 @@ class MonitorDatabase(object):
try:
self.action(insert_query, value_dict.values() + key_dict.values())
except sqlite3.IntegrityError:
logger.info('Queries failed: %s and %s', update_query, insert_query)
logger.info(u"PlexPy Database :: Queries failed: %s and %s", update_query, insert_query)
# We want to know if it was an update or insert
return trans_type