seitime-frappe/cgi-bin/webnotes/utils/backups.py
2011-06-08 14:24:18 +05:30

107 lines
2.9 KiB
Python

import webnotes
backup_folder = '/backups'
mysql_path = ''
download_folder = 'backups'
def mysqldump(db, folder=''):
global mysql_path
import os
import webnotes.defs
os.system('%(path)smysqldump %(db)s > %(folder)s%(db)s.sql -u %(db)s -p%(pwd)s --ignore-table=%(db)s.__DocTypeCache' % {'path':mysql_path, 'db':db, 'pwd':webnotes.defs.db_password, 'folder':folder})
def backup_db(db, conn, from_all=0):
import os
global backup_folder
try:
# Check processlist
if from_all or len(conn.sql("show processlist")) == 1:
p = backup_folder
if from_all: p = backup_folder + '/dumps'
# clear old file
os.system('rm %s/%s.tar.gz' % (p,db))
# dump
mysqldump(db, p+'/')
# zip
os.system('tar czf %s/%s.tar.gz %s/%s.sql' % (p, db, p, db))
os.system('rm %s/%s.sql' % (p, db))
else:
print("Another process is running in database. Please try again")
except Exception, e:
#sql('unlock tables')
raise e
def backup_all():
# backups folder
import os
import webnotes.db
global backup_folder
conn = webnotes.db.Database(use_default=1)
dblist = conn.sql('select db_name from tabAccount')
# backup -all in /backups folder
for d in (('accounts',),) + dblist:
backup_db(d[0], conn, 1)
conn.close()
# dump all in /daily folder
import time, datetime
fname = 'daily-' + time.strftime('%Y-%m-%d') + '.tar.gz'
# daily dump
os.system('tar czf %s/daily/%s %s/dumps' % (backup_folder, fname, backup_folder))
# keep only three files
if len(os.listdir(backup_folder + '/daily')) > 3:
delete_oldest_file(backup_folder + '/daily')
# if sunday, then copy to weekly
if datetime.datetime.now().weekday()==6:
os.system('cp '+backup_folder+'/daily/'+fname+' '+backup_folder+'/weekly/'+fname)
# keep only three files
if len(os.listdir(backup_folder + '/weekly')) > 3:
delete_oldest_file(backup_folder + '/weekly')
def delete_oldest_file(folder):
import os
a = sorted(os.listdir(folder), key=lambda fn: os.stat(folder+'/'+fn).st_mtime, reverse=False)
if a:
os.system('rm %s/%s' % (folder, a[0]))
def get_backup():
import webnotes
import os, time
global backup_folder, download_folder
# get the last nightly backup file from the backups folder
os.chdir(download_folder)
if webnotes.conn.cur_db_name:
fname = webnotes.conn.cur_db_name + '.tar.gz'
# rename it
from random import choice
lnd='0123456789'
new_name = ''.join(map(lambda x,y=lnd: choice(y), range(8))) + '.sql.gz'
folder = backup_folder + '/dumps/'
# get the newest file
if os.path.exists(folder):
os.system('cp '+ folder + webnotes.conn.cur_db_name+'.sql.gz' + ' ./' + new_name)
webnotes.msgprint('Your nightly backup is available for download by <a href="'+download_folder+'/' + new_name + '">clicking here</a> (only for the next few hours)')
# delete any files older than a day
now = time.time()
for f in os.listdir('.'):
if os.stat(f).st_mtime < (now - 86400):
if os.path.isfile(f):
os.remove(f)