mirror of https://github.com/bvn13/PyBackuper.git
146 lines
5.2 KiB
Python
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") |