Backup databases
This commit is contained in:
+34
-3
@@ -7,6 +7,7 @@ from couchpotato.core.event import fireEventAsync, fireEvent
|
|||||||
from couchpotato.core.helpers.encoding import toUnicode
|
from couchpotato.core.helpers.encoding import toUnicode
|
||||||
from couchpotato.core.helpers.variable import getDataDir, tryInt
|
from couchpotato.core.helpers.variable import getDataDir, tryInt
|
||||||
from logging import handlers
|
from logging import handlers
|
||||||
|
from scandir import scandir
|
||||||
from tornado.httpserver import HTTPServer
|
from tornado.httpserver import HTTPServer
|
||||||
from tornado.web import Application, StaticFileHandler, RedirectHandler
|
from tornado.web import Application, StaticFileHandler, RedirectHandler
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
@@ -17,6 +18,8 @@ import sys
|
|||||||
import time
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
import warnings
|
import warnings
|
||||||
|
import re
|
||||||
|
import tarfile
|
||||||
|
|
||||||
|
|
||||||
def getOptions(base_path, args):
|
def getOptions(base_path, args):
|
||||||
@@ -88,13 +91,41 @@ def runCouchPotato(options, base_path, args, data_dir = None, log_dir = None, En
|
|||||||
db = ThreadSafeDatabase(db_path)
|
db = ThreadSafeDatabase(db_path)
|
||||||
db_exists = db.exists()
|
db_exists = db.exists()
|
||||||
if db_exists:
|
if db_exists:
|
||||||
|
|
||||||
|
# Backup before start and cleanup old backups
|
||||||
|
backup_path = toUnicode(os.path.join(data_dir, 'db_backup'))
|
||||||
|
backup_count = 5
|
||||||
|
existing_backups = []
|
||||||
|
if not os.path.isdir(backup_path): os.makedirs(backup_path)
|
||||||
|
|
||||||
|
for root, dirs, files in scandir.walk(backup_path):
|
||||||
|
for file in files:
|
||||||
|
ints = re.findall('\d+', file)
|
||||||
|
|
||||||
|
# Delete non zip files
|
||||||
|
if len(ints) != 1:
|
||||||
|
os.remove(os.path.join(backup_path, file))
|
||||||
|
else:
|
||||||
|
existing_backups.append((int(ints[0]), file))
|
||||||
|
|
||||||
|
# Remove all but the last 5
|
||||||
|
for eb in existing_backups[:-backup_count]:
|
||||||
|
os.remove(os.path.join(backup_path, eb[1]))
|
||||||
|
|
||||||
|
# Create new backup
|
||||||
|
new_backup = toUnicode(os.path.join(backup_path, '%s.tar.gz' % int(time.time())))
|
||||||
|
zipf = tarfile.open(new_backup, 'w:gz')
|
||||||
|
for root, dirs, files in scandir.walk(db_path):
|
||||||
|
for file in files:
|
||||||
|
zipf.add(os.path.join(root, file), arcname = 'database/%s' % os.path.join(root[len(db_path)+1:], file))
|
||||||
|
zipf.close()
|
||||||
|
|
||||||
|
# Open last
|
||||||
db.open()
|
db.open()
|
||||||
db.compact()
|
|
||||||
else:
|
else:
|
||||||
db.create()
|
db.create()
|
||||||
|
|
||||||
# TODO:Backup before start and cleanup old databases
|
|
||||||
|
|
||||||
# Register environment settings
|
# Register environment settings
|
||||||
Env.set('app_dir', toUnicode(base_path))
|
Env.set('app_dir', toUnicode(base_path))
|
||||||
Env.set('data_dir', toUnicode(data_dir))
|
Env.set('data_dir', toUnicode(data_dir))
|
||||||
|
|||||||
Reference in New Issue
Block a user