Sincrionizacion con SeaFile general

This commit is contained in:
Mauricio Baeza 2017-12-10 12:12:06 -06:00
parent f2c9de3660
commit 37aea443d6
5 changed files with 199 additions and 17 deletions

View File

@ -11,3 +11,15 @@ DEFAULT_PASSWORD = 'blades3.3'
#~ Establece una ruta accesible para el servidor web
LOG_PATH = '/srv/empresa/logs/empresalibre.log'
# ~ Establece los valores para sincronizar los backups de la base de datos
# ~ por ejemplo
# ~ SEAFILE_SERVER = {
# ~ 'URL': 'https://tu_servidor_seafile',
# ~ 'USER': 'tu_usuario',
# ~ 'PASS': 'tu_contraseña',
# ~ 'REPO': 'id_repo',
# ~ }
SEAFILE_SERVER = {}

View File

@ -12,6 +12,9 @@ from email.mime.text import MIMEText
from email import encoders
from email.utils import formatdate
import os
import requests
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate, Image
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
@ -724,3 +727,140 @@ class ReportTemplate(BaseDocTemplate):
return
class SeaFileAPI(object):
FILE_DOES_NOT_EXIST = 441
def __init__(self, url, username, password):
self._url = url
self._headers = self._get_auth(username, password)
@property
def is_connect(self):
return bool(self._headers)
def _open(self, path):
return open(path, 'rb')
def _get_auth(self, username, password):
url = self._url + 'auth-token/'
data = {
'username': username,
'password': password,
}
resp = requests.post(url, data=data)
if resp.status_code != requests.codes.ok:
msg = 'Token Error: {}'.format(resp.status_code)
print (msg)
return {}
headers = {'Authorization': 'Token {}'.format(resp.json()['token'])}
return headers
def _get_upload_link(self, repo_id):
if not self._headers:
return ''
url = '{}repos/{}/upload-link/'.format(self._url, repo_id)
resp = requests.get(url, headers=self._headers)
if resp.status_code != requests.codes.ok:
msg = 'Error: {}'.format(resp.status_code)
print (msg)
return ''
return resp.json()
def _get_update_link(self, repo_id):
if not self._headers:
return ''
url = '{}repos/{}/update-link/'.format(self._url, repo_id)
data = {'p': '/'}
resp = requests.get(url, data=data, headers=self._headers)
if resp.status_code != requests.codes.ok:
msg = 'Error: {}'.format(resp.status_code)
print (msg)
return ''
return resp.json()
def _decrypt(self, repo_id, password):
if not self._headers:
return False
url = '{}repos/{}/'.format(self._url, repo_id)
data = {'password': password}
resp = requests.post(url, data=data, headers=self._headers)
if resp.status_code != requests.codes.ok:
msg = 'Error: {}'.format(resp.status_code)
print (msg)
return False
return True
def upload_file(self, path_file, repo_id, password):
if not self._headers:
return False
if password:
if not self._decrypt(repo_id, password):
return False
upload_link = self._get_upload_link(repo_id)
data = {
'filename': path_file,
'parent_dir': '/',
'relative_path': '',
}
files = {'file': self._open(path_file)}
resp = requests.post(
upload_link, data=data, files=files, headers=self._headers)
if resp.status_code != requests.codes.ok:
msg = 'Upload Code: {}\n{}'.format(resp.status_code, resp.text)
print (msg)
return False
return True
def _info_path(self, path):
path, filename = os.path.split(path)
return path, filename
def update_file(self, path_file, repo_id, password, create=True):
if not self._headers:
return False
if password:
if not self._decrypt(repo_id, password):
return False
update_link = self._get_update_link(repo_id)
_, filename = self._info_path(path_file)
files = {
'file': (filename, self._open(path_file)),
'filename': (None, filename),
'target_file': (None, '/{}'.format(filename))
}
resp = requests.post(update_link, files=files, headers=self._headers)
if resp.status_code != requests.codes.ok:
msg = 'Update Code: {}\n{}'.format(resp.status_code, resp.text)
print (msg)
if resp.status_code == self.FILE_DOES_NOT_EXIST and create:
return self.upload_file(path_file, repo_id, password)
else:
return False
return True
def ping(self):
url = self._url + 'ping/'
resp = requests.get(url)
return resp.json()
def auth_ping(self):
url = self._url + 'auth/ping/'
resp = requests.get(url, headers=self._headers)
return resp.json()

View File

@ -33,18 +33,13 @@ except:
import pyqrcode
from dateutil import parser
from .helper import CaseInsensitiveDict, NumLet, SendMail, TemplateInvoice
from .helper import CaseInsensitiveDict, NumLet, SendMail, TemplateInvoice, \
SeaFileAPI
from settings import DEBUG, log, template_lookup, COMPANIES, DB_SAT, \
PATH_XSLT, PATH_XSLTPROC, PATH_OPENSSL, PATH_TEMPLATES, PATH_MEDIA, PRE, \
PATH_XMLSEC, TEMPLATE_CANCEL, DEFAULT_SAT_PRODUCTO, DECIMALES
#~ def _get_hash(password):
#~ return bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
#~ def validate_password(hashed, password):
#~ return bcrypt.hashpw(password.encode(), hashed.encode()) == hashed.encode()
from settings import SEAFILE_SERVER
def _call(args):
@ -1390,11 +1385,46 @@ def crear_db(nombre):
def _to_seafile(path_db, data):
msg = '\tSincronizando backup...'
log.info(msg)
# ~ if DEBUG:
# ~ return
_, filename = os.path.split(path_db)
if SEAFILE_SERVER:
msg = '\tSincronizando backup general...'
log.info(msg)
seafile = SeaFileAPI(
SEAFILE_SERVER['URL'],
SEAFILE_SERVER['USER'],
SEAFILE_SERVER['PASS'])
if seafile.is_connect:
msg = '\tSincronizando: {} '.format(filename)
log.info(msg)
seafile.update_file(
path_db, SEAFILE_SERVER['REPO'], SEAFILE_SERVER['PASS'])
msg = '\tRespaldo general de {} sincronizado'.format(filename)
log.info(msg)
if len(data) < 2:
return
if not data[0] or not data[1]:
return
# ~ msg = '\tSincronizando backup particular...'
# ~ log.info(msg)
# ~ seafile = SeaFileAPI(SEAFILE_SERVER['URL'], data[0], data[1])
# ~ if seafile.is_connect:
# ~ msg = '\tSincronizando: {} '.format(filename)
# ~ log.info(msg)
# ~ seafile.update_file(
# ~ path_db, SEAFILE_SERVER['REPO'], data[1])
# ~ msg = '\tRespaldo partícular de {} sincronizado'.format(filename)
# ~ log.info(msg)
return
@run_in_thread
def _backup_and_sync(rfc, data):
msg = 'Generando backup de: {}'.format(rfc)
log.info(msg)
@ -1413,11 +1443,6 @@ def _backup_and_sync(rfc, data):
msg = '\tBackup generado...'
log.info(msg)
result = _call(sql).strip().split('|')
if len(result) < 2:
return
if not result[0] or not result[1]:
return
_to_seafile(path_bk, result)
except Exception as e:
log.info(e)
@ -1438,7 +1463,7 @@ def backup_dbs():
for rfc, data in rows:
args = loads(data)
run_in_thread(_backup_and_sync(rfc, args))
_backup_and_sync(rfc, args)
return

View File

@ -14,6 +14,11 @@ try:
except ImportError:
DEFAULT_PASSWORD = 'blades3.3'
try:
from conf import SEAFILE_SERVER
except ImportError:
SEAFILE_SERVER = {}
DEBUG = DEBUG
VERSION = '0.2.1'

View File

@ -148,7 +148,7 @@ var emisor_otros_datos= [
{view: 'text', id: 'token_timbrado',
name: 'token_timbrado', label: 'Token de Timbrado: '},
{view: 'text', id: 'token_soporte',
name: 'token_soporte', label: 'Token de Soporte: '},
name: 'token_soporte', label: 'Token para Respaldos: '},
]