mirror of
https://github.com/Tautulli/Tautulli.git
synced 2025-07-11 15:56:07 -07:00
Schedule PlexPy database backup task
This commit is contained in:
parent
70325f9247
commit
5d738e58eb
3 changed files with 20 additions and 17 deletions
|
@ -333,6 +333,8 @@ def initialize_scheduler():
|
||||||
schedule_job(pmsconnect.refresh_libraries, 'Refresh libraries list',
|
schedule_job(pmsconnect.refresh_libraries, 'Refresh libraries list',
|
||||||
hours=hours, minutes=0, seconds=0)
|
hours=hours, minutes=0, seconds=0)
|
||||||
|
|
||||||
|
schedule_job(database.make_backup, 'Backup PlexPy database', hours=6, minutes=0, seconds=0, args=(True,))
|
||||||
|
|
||||||
# Start scheduler
|
# Start scheduler
|
||||||
if start_jobs and len(SCHED.get_jobs()):
|
if start_jobs and len(SCHED.get_jobs()):
|
||||||
try:
|
try:
|
||||||
|
@ -344,7 +346,7 @@ def initialize_scheduler():
|
||||||
#SCHED.print_jobs()
|
#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.
|
Start scheduled job if starting or restarting plexpy.
|
||||||
Reschedule job if Interval Settings have changed.
|
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)
|
logger.info("Removed background task: %s", name)
|
||||||
elif job.trigger.interval != datetime.timedelta(hours=hours, minutes=minutes):
|
elif job.trigger.interval != datetime.timedelta(hours=hours, minutes=minutes):
|
||||||
SCHED.reschedule_job(name, trigger=IntervalTrigger(
|
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)
|
logger.info("Re-scheduled background task: %s", name)
|
||||||
elif hours > 0 or minutes > 0 or seconds > 0:
|
elif hours > 0 or minutes > 0 or seconds > 0:
|
||||||
SCHED.add_job(function, id=name, trigger=IntervalTrigger(
|
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)
|
logger.info("Scheduled background task: %s", name)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,8 @@ SCHEDULER_LIST = ['Check GitHub for updates',
|
||||||
'Check for recently added items',
|
'Check for recently added items',
|
||||||
'Check for Plex remote access',
|
'Check for Plex remote access',
|
||||||
'Refresh users list',
|
'Refresh users list',
|
||||||
'Refresh libraries list'
|
'Refresh libraries list',
|
||||||
'Refresh Plex server URLs',
|
'Refresh Plex server URLs',
|
||||||
'Refresh Plex server name',
|
'Refresh Plex server name',
|
||||||
|
'Backup PlexPy database'
|
||||||
]
|
]
|
|
@ -47,7 +47,7 @@ def db_filename(filename="plexpy.db"):
|
||||||
|
|
||||||
|
|
||||||
def make_backup(cleanup=False):
|
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
|
backupfolder = plexpy.CONFIG.BACKUP_DIR
|
||||||
backup_file = 'plexpy.backup-%s.db' % int(time.time())
|
backup_file = 'plexpy.backup-%s.db' % int(time.time())
|
||||||
|
@ -63,22 +63,22 @@ def make_backup(cleanup=False):
|
||||||
db.connection.rollback()
|
db.connection.rollback()
|
||||||
|
|
||||||
if cleanup:
|
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):
|
for root, dirs, files in os.walk(backupfolder):
|
||||||
if len(files) > 3:
|
db_files = [os.path.join(root, f) for f in files if f.endswith('.db')]
|
||||||
all_files = [os.path.join(root, f) for f in files]
|
if len(db_files) > 5:
|
||||||
backups_sorted_on_age = sorted(all_files, key=os.path.getctime, reverse=True)
|
backups_sorted_on_age = sorted(db_files, key=os.path.getctime, reverse=True)
|
||||||
for file_ in backups_sorted_on_age[3:]:
|
for file_ in backups_sorted_on_age[5:]:
|
||||||
try:
|
try:
|
||||||
os.remove(file_)
|
os.remove(file_)
|
||||||
except OSError as e:
|
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):
|
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
|
return True
|
||||||
else:
|
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
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,15 +131,15 @@ class MonitorDatabase(object):
|
||||||
|
|
||||||
except sqlite3.OperationalError, e:
|
except sqlite3.OperationalError, e:
|
||||||
if "unable to open database file" in e.message or "database is locked" in e.message:
|
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
|
attempts += 1
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
else:
|
else:
|
||||||
logger.error('Database error: %s', e)
|
logger.error(u"PlexPy Database :: Database error: %s", e)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
except sqlite3.DatabaseError, e:
|
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
|
raise
|
||||||
|
|
||||||
return sql_result
|
return sql_result
|
||||||
|
@ -183,7 +183,7 @@ class MonitorDatabase(object):
|
||||||
try:
|
try:
|
||||||
self.action(insert_query, value_dict.values() + key_dict.values())
|
self.action(insert_query, value_dict.values() + key_dict.values())
|
||||||
except sqlite3.IntegrityError:
|
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
|
# We want to know if it was an update or insert
|
||||||
return trans_type
|
return trans_type
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue