PyBackuper/backuper/storer.py

146 lines
5.2 KiB
Python

import easywebdav
import ntpath
import datetime
import logging
class BackupStorer(object) :
settings = {}
path = '/'
def __init__(self):
return
def store(self, fname, date=None, time=None, folder=None) :
raise NotImplementedError("Call an abstract method")
def manageStorage(self) :
raise NotImplementedError("Call an abstract method")
class BackupStorerYandexDisk(BackupStorer) :
webdav = None
def setDomain(self, domain) :
self.settings['domain'] = domain
def setUsername(self, username) :
self.settings['username'] = username
def setPassword(self, password) :
self.settings['password'] = password
def setProtocol(self, protocol) :
self.settings['protocol'] = protocol
def setCertificate(self, cert) :
self.settings['cert'] = cert
def setDaysLeft(self, left_days) :
self.settings['left_days'] = left_days
def setManageEnabled(self, enabled) :
self.settings['manage_enabled'] = enabled
def setPath(self, path) :
self.path = path
if (self.path[-1] != '/') :
self.path = "%s/" % (self.path,)
def init(self) :
if ('cert' in self.settings.keys()) :
self.webdav = easywebdav.connect(self.settings['domain'],
username=self.settings['username'],
password=self.settings['password'],
protocol=self.settings['protocol'],
cert=self.settings['cert']
)
else :
self.webdav = easywebdav.connect(self.settings['domain'],
username=self.settings['username'],
password=self.settings['password'],
protocol=self.settings['protocol']
)
def store(self, fname, nowDate, nowTime, folder=None) :
if not self.webdav :
self.init()
folderDate = "%s%s" % (self.path, nowDate)
if folder :
subfolder = "%s%s/%s" % (self.path, nowDate, folder)
folderTime = "%s%s/%s/%s" % (self.path, nowDate, folder, nowTime)
else :
subfolder = "%s%s/%s" % (self.path, nowDate, nowTime)
folderTime = "%s%s/%s" % (self.path, nowDate, nowTime)
# folder like Date
if not self.webdav.exists(folderDate) :
self.webdav.mkdir(folderDate)
logging.info("WEBDAV: dir %s created" % (folderDate,))
#subfolder if specified
if folder and not self.webdav.exists(subfolder) :
self.webdav.mkdir(subfolder)
logging.info("WEBDAV: dir %s created" % (subfolder,))
#folder like Time
if not self.webdav.exists(folderTime) :
self.webdav.mkdir(folderTime)
logging.info("WEBDAV: dir %s created" % (folderTime,))
localFname = ntpath.basename(fname)
remoteFname = "%s/%s" % (folderTime, localFname)
logging.info("uploading file: %s -> %s" % (fname, remoteFname))
self.webdav.upload(fname, remoteFname)
logging.info("upload completed: %s -> %s" % (fname, remoteFname))
return remoteFname
def manageStorage(self) :
if (not self.settings['manage_enabled']) :
return
if not self.webdav :
self.init()
logging.info("LEFT SPACE MANAGEMENT")
logging.info("planned to left %s days" % (self.settings['left_days'],))
now = datetime.datetime.now()
logging.info("now: %s" % (now,))
nowDate = now.strftime("%Y%m%d")
logging.info("nowDate: %s" % (nowDate,))
logging.info("path: %s, webdav: %s" % (self.path, self.webdav))
days = self.webdav.ls('/')
logging.info("ls done")
#logging.info("days dirs: %s" % (days,))
#currDay = int(nowDate)
currDay = datetime.date(int(nowDate[0:4]), int(nowDate[4:6]), int(nowDate[6:8]))
logging.info("currDay: %s" % (currDay,))
for file in days :
if (file.name != '/') :
day = file.name.replace('/', '')
#logging.info("testing folder by date: %s" % (day,))
dayBup = None
try :
dayBup = datetime.date(int(day[0:4]), int(day[4:6]), int(day[6:8]))
#logging.info("dayBup: %s" % (dayBup,))
except ValueError :
#logging.info("unexpected day, skipped: %s, %s" % (file.name, day))
continue
dd = str(currDay - dayBup)
#logging.info("%s" % (dd,))
try:
period = int(dd.split()[0])
if (period > int(self.settings['left_days'])) :
logging.info("deleting remote folder: %s" % (file.name,))
self.webdav.rmdir(file.name)
else :
logging.info("skipping remote folder: %s" % (file.name,))
#continue
except :
pass
logging.info("store management done")