Browse Source

porting to new api [FIX] schedule_backup method [IMP] IT translation [IMP] tests

pull/636/head
archetipo 10 years ago
committed by Dave Lasley
parent
commit
01087ea59a
  1. 1
      auto_backup/__init__.py
  2. 18
      auto_backup/__openerp__.py
  3. 27
      auto_backup/data/autobackup_mail_template.xml
  4. 363
      auto_backup/i18n/it.po
  5. 361
      auto_backup/model/backup_scheduler.py
  6. 2
      auto_backup/security/ir.model.access.csv
  7. 22
      auto_backup/tests/__init__.py
  8. 64
      auto_backup/tests/test_auto_backup.py

1
auto_backup/__init__.py

@ -21,4 +21,5 @@
##############################################################################
from . import model
from . import tests
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

18
auto_backup/__openerp__.py

@ -23,17 +23,23 @@
{
"name" : "Database Auto-Backup",
"version" : "1.0",
"author" : "VanRoey.be - Yenthe Van Ginneken, Agile Business Group",
"author" :(
"VanRoey.be - Yenthe Van Ginneken, Agile Business Group,"
" Odoo Community Association (OCA)"
),
"website" : "http://www.vanroey.be/applications/bedrijfsbeheer/odoo",
"category" : "Tools",
"summary": "Backups data base",
"depends" : ['base'],
"init_xml" : [],
"demo_xml" : [],
"update_xml" : [
"view/bkp_conf_view.xml",
"depends" : ['base','email_template'],
"demo_xml" : [
"data/backup_data.xml"
],
"data" : [
"view/bkp_conf_view.xml",
"data/backup_data.xml",
"data/autobackup_mail_template.xml",
"security/ir.model.access.csv"
],
"active": False,
"installable": True
}

27
auto_backup/data/autobackup_mail_template.xml

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data noupdate="0">
<record id="email_template_autobackup_error_noificaiton" model="email.template">
<field name="name">Auto Backup Error notification</field>
<field name="email_from">auto_backup@${object.name}</field>
<field name="subject">Backup from ${object.host} - (${object.sftpip}) failed</field>
<field name="email_to">${object.emailtonotify}</field>
<field name="model_id" ref="auto_backup.model_db_backup" />
<field name="body_html">
<![CDATA[
<p>Dear,</p>
<p>The backup for the server ${object.host} (IP: ${object.sftpip}) failed.</p>
<p>Please check the following details:</p>
<p>IP address SFTP server: ${object.sftpip}</p>
<p>Username: ${object.sftpusername}</p>
<p>Password: ${object.sftppassword}</p>
<p>Error details: ${object.lasterrorlog}</p>
<p>With kind regards</p>
]]></field>
</record>
</data>
</openerp>

363
auto_backup/i18n/it.po

@ -0,0 +1,363 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * auto_backup
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 8.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-07-21 13:00+0000\n"
"PO-Revision-Date: 2015-07-21 13:00+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: auto_backup
#: model:email.template,body_html:auto_backup.email_template_autobackup_error_noificaiton
msgid "\n"
" \n"
" <p>Dear,</p>\n"
"\n"
" <p>The backup for the server ${object.host} (IP: ${object.sftpip}) failed.</p>\n"
" <p>Please check the following details:</p>\n"
" <p>IP address SFTP server: ${object.sftpip}</p>\n"
" <p>Username: ${object.sftpusername}</p>\n"
" <p>Password: ${object.sftppassword}</p>\n"
" <p>Error details: ${object.lasterrorlog}</p>\n"
" <p>With kind regards</p>\n"
"\n"
" "
msgstr "\n"
" \n"
" <p>Buongiorno,</p>\n"
"\n"
" <p>Il backup del DB del server ${object.host} (IP: ${object.sftpip}) e' fallito.</p>\n"
" <p>Si prega di controllare le seguenti impostazioni:</p>\n"
" <p>Indirizzo IP server SFTP: ${object.sftpip}</p>\n"
" <p>Username: ${object.sftpusername}</p>\n"
" <p>Password: ${object.sftppassword}</p>\n"
" <p>Dettaglio errore: ${object.lasterrorlog}</p>\n"
" <p>Cordiali Saluti</p>\n"
"\n"
" "
#. module: auto_backup
#: code:addons/auto_backup/model/backup_scheduler.py:204
#, python-format
msgid "\n"
"Your IP address seems to be too short.\n"
""
msgstr "\n"
"L' indirizzo IP sembra essere troppo corto.\n"
""
#. module: auto_backup
#: code:addons/auto_backup/model/backup_scheduler.py:209
#, python-format
msgid "%s"
msgstr "%s"
#. module: auto_backup
#: code:addons/auto_backup/model/backup_scheduler.py:288
#, python-format
msgid "(Part of the) path didn't exist. Creating it now at %s"
msgstr "(Una parte del) path non esiste. Verra' creato in %s"
#. module: auto_backup
#: help:db.backup,bkp_dir:0
msgid "Absolute path for storing the backups"
msgstr "Percorso assoluto per il salvataggio del DB"
#. module: auto_backup
#: field:db.backup,sendmailsftpfail:0
msgid "Auto. E-mail on backup fail"
msgstr "Auto. E-mail nel caso di errori durante il backup "
#. module: auto_backup
#: field:db.backup,autoremove:0
msgid "Auto. Remove Backups"
msgstr "Rimuovi Backups"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Automatic backups of the database can be scheduled as follows:"
msgstr "Il backup automatico del DB e' pianificato come segue:"
#. module: auto_backup
#: field:db.backup,bkp_dir:0
msgid "Backup Directory"
msgstr "Backup Directory"
#. module: auto_backup
#: model:email.template,subject:auto_backup.email_template_autobackup_error_noificaiton
msgid "Backup from ${object.host} - (${object.sftpip}) failed"
msgstr "Backup da ${object.host} - (${object.sftpip}) fallito"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_tree
msgid "Backups"
msgstr "Backups"
#. module: auto_backup
#: help:db.backup,daystokeepsftp:0
msgid "Choose after how many days the backup should be deleted from the FTP server. For example:\n"
"If you fill in 5 the backups will be removed after 5 days from the FTP server."
msgstr "Scegliere dopo quanti giorni si possa condsiderare da eliminare, un Backup nel server FTP. Per esempio:\n"
"se si imposta 5 i files di backups piu' vecchi di 5 giorni saranno eliminati dal server FTP"
#. module: auto_backup
#: help:db.backup,daystokeep:0
msgid "Scegliere dopo quanti giorni si possa condsiderare da eliminare un Backup. For example:\n"
"If you fill in 5 the backups will be removed after 5 days."
msgstr "Choose after how many days the backup should be deleted. For example:\n"
"se si imposta 5 i files di backups piu' vecchi di 5 giorni saranno eliminati."
#. module: auto_backup
#: model:ir.actions.act_window,name:auto_backup.action_backup_conf_form
#: model:ir.ui.menu,name:auto_backup.backup_conf_menu
msgid "Configure Backup"
msgstr "Configura Backup"
#. module: auto_backup
#: code:addons/auto_backup/model/backup_scheduler.py:202
#, python-format
msgid "Connection Test Failed!"
msgstr "Test connessione Fallito!"
#. module: auto_backup
#: code:addons/auto_backup/model/backup_scheduler.py:198
#, python-format
msgid "Connection Test Succeeded!"
msgstr "Test connessione avvenuto con successo!"
#. module: auto_backup
#: code:addons/auto_backup/model/backup_scheduler.py:241
#, python-format
msgid "Couldn't backup database %s. Bad database administratorpassword for server running at http://%s:%s"
msgstr "Impossibile eseguire il backup di %s. DB password erraata per il server http://%s:%s"
#. module: auto_backup
#: field:db.backup,create_uid:0
msgid "Created by"
msgstr "Created by"
#. module: auto_backup
#: field:db.backup,create_date:0
msgid "Created on"
msgstr "Created on"
#. module: auto_backup
#: field:db.backup,name:0
msgid "Database"
msgstr "Database"
#. module: auto_backup
#: help:db.backup,name:0
msgid "Database you want to schedule backups for"
msgstr "Database you want to schedule backups for"
#. module: auto_backup
#: field:db.backup,emailtonotify:0
#: field:db.backup,lasterrorlog:0
msgid "E-mail to notify"
msgstr "E-mail di notifica"
#. module: auto_backup
#: code:addons/auto_backup/model/backup_scheduler.py:176
#, python-format
msgid "Error"
msgstr "Errore"
#. module: auto_backup
#: code:addons/auto_backup/model/backup_scheduler.py:176
#, python-format
msgid "Error ! No such database exists!"
msgstr "Errore ! Il DB non esiste!"
#. module: auto_backup
#: code:addons/auto_backup/model/backup_scheduler.py:199
#, python-format
msgid "Everything seems properly set up for FTP back-ups!"
msgstr "Tutto sembra impostato correttamente per il back-up FTP!"
#. module: auto_backup
#: help:db.backup,emailtonotify:0
#: help:db.backup,lasterrorlog:0
msgid "Fill in the e-mail where you want to be notified that the backup failed on the FTP."
msgstr "Compilare l'e -mail in cui si desidera essere avvisati,se il backup FTP fallisce."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "For example: /odoo/backups/"
msgstr "Es.: /odoo/backups/"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Go to Settings / Technical / Automation / Scheduled Actions."
msgstr "Anadare in Settings / Technical / Automation / Scheduled Actions."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Help"
msgstr "Aiuto"
#. module: auto_backup
#: field:db.backup,host:0
msgid "Host"
msgstr "Host"
#. module: auto_backup
#: field:db.backup,id:0
msgid "ID"
msgstr "ID"
#. module: auto_backup
#: field:db.backup,sftpip:0
msgid "IP Address SFTP Server"
msgstr "IP Address SFTP Server"
#. module: auto_backup
#: help:db.backup,sendmailsftpfail:0
msgid "If you check this option you can choose to automaticly get e-mailed when the backup to the external server failed."
msgstr "Se si seleziona questa opzione è possibile scegliere di essere notificati automaticamente via e-mail quando il backup al server esterno fallisce ."
#. module: auto_backup
#: help:db.backup,autoremove:0
msgid "If you check this option you can choose to automaticly remove the backup after xx days"
msgstr "Se si seleziona questa opzione è possibile scegliere di rimuovere automaticamente il backup dopo xx giorni"
#. module: auto_backup
#: help:db.backup,sftpwrite:0
msgid "If you check this option you can specify the details needed to write to a remote server with SFTP."
msgstr "Se si seleziona questa opzione è possibile specificare i dettagli necessari per scrivere a un server remoto con SFTP ."
#. module: auto_backup
#: field:db.backup,write_uid:0
msgid "Last Updated by"
msgstr "Last Updated by"
#. module: auto_backup
#: field:db.backup,write_date:0
msgid "Last Updated on"
msgstr "Last Updated on"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Local backup configuration"
msgstr "Configurazione backup locale"
#. module: auto_backup
#: field:db.backup,sftppassword:0
msgid "Password User SFTP Server"
msgstr "Password utene SFTP Server"
#. module: auto_backup
#: field:db.backup,sftppath:0
msgid "Path external server"
msgstr "Path server esterno"
#. module: auto_backup
#: field:db.backup,port:0
msgid "Port"
msgstr "Porta"
#. module: auto_backup
#: field:db.backup,daystokeepsftp:0
msgid "Remove SFTP after x days"
msgstr "Rimuovi backup da SFTP dopo x giorni"
#. module: auto_backup
#: field:db.backup,daystokeep:0
msgid "Remove after x days"
msgstr "Rimuovi dopo x giorni"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "SFTP"
msgstr "SFTP"
#. module: auto_backup
#: field:db.backup,sftpport:0
msgid "SFTP Port"
msgstr "Porta SFTP"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_search
msgid "Search options"
msgstr "Search options"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Search the action named 'Backup scheduler'."
msgstr "Cerca l'azione denominata ' di pianificazione del backup ' ."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Set the scheduler to active and fill in how often you want backups generated."
msgstr "Impostare lo scheduler per attivare e compilare la frequenza con cui si desidera generare il backup."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Test"
msgstr "Test"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Test SFTP Connection"
msgstr "Test SFTP Connection"
#. module: auto_backup
#: help:db.backup,sftpip:0
msgid "The IP address from your remote server. For example 192.168.0.1"
msgstr "Indirizzo IP server remoto. Es. 192.168.0.1"
#. module: auto_backup
#: help:db.backup,sftppath:0
msgid "The location to the folder where the dumps should be written to. For example /odoo/backups/.\n"
"Files will then be written to /odoo/backups/ on your remote server."
msgstr "La posizione della cartella in cui i dumps devono essere scritti. Es. /odoo/backups/.\n"
"i files verranno scritti su /odoo/backups/ nel server remoto."
#. module: auto_backup
#: help:db.backup,sftppassword:0
msgid "The password from the user where the SFTP connection should be made with. This is the password from the user on the external server."
msgstr "La password dell'utente con cui la connessione SFTP deve essere fatta. Questa è la password dall'utente sul server esterno ."
#. module: auto_backup
#: help:db.backup,sftpport:0
msgid "The port on the FTP server that accepts SSH/SFTP calls."
msgstr "La porta sul server FTP che accetta chiamate SSH / SFTP."
#. module: auto_backup
#: help:db.backup,sftpusername:0
msgid "The username where the SFTP connection should be made with. This is the user on the external server."
msgstr "Il nome utente in cui la connessione SFTP dovrebbe essere fatto con . Questo è l'utente sul server esterno."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "This configures the scheduler for automatic backup of the given database running on given host at given port on regular intervals."
msgstr "pianificazione per il backup automatico del database in esecuzione su dato host /porta ad intervalli regolari."
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Use SFTP with caution! This writes files to external servers under the path you specify."
msgstr "Usare SFTP con cautela ! Questo scrive file su server esterni nel percorso specificato "
#. module: auto_backup
#: field:db.backup,sftpusername:0
msgid "Username SFTP Server"
msgstr "Username SFTP Server"
#. module: auto_backup
#: view:db.backup:auto_backup.view_backup_conf_form
msgid "Warning:"
msgstr "Warning:"
#. module: auto_backup
#: field:db.backup,sftpwrite:0
msgid "Write to external server with sftp"
msgstr "Salva il backup anche su server FTP esterno"

361
auto_backup/model/backup_scheduler.py

@ -2,7 +2,7 @@
##############################################################################
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
# $Id$
# Copyright 2015 Agile Business Group <http://www.agilebg.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -33,9 +33,10 @@ except ImportError:
'through SFTP.Please install pysftp on your system.'
'(sudo pip install pysftp)'
)
from openerp.osv import fields, osv
from openerp import models, fields, api, _
from openerp.exceptions import except_orm, Warning
from openerp import tools
from openerp import netsvc, _
from openerp import netsvc
import logging
_logger = logging.getLogger(__name__)
@ -48,142 +49,146 @@ def execute(connector, method, *args):
raise e
return res
addons_path = tools.config['addons_path'] + '/auto_backup/DBbackups'
class db_backup(osv.Model):
class db_backup(models.Model):
_name = 'db.backup'
def get_db_list(self, cr, user, ids, host, port, context={}):
print("Host: " + host)
print("Port: " + port)
uri = 'http://' + host + ':' + port
conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/db')
def get_connection(self, host, port):
uri = 'http://%s:%s' % (host, port)
return xmlrpclib.ServerProxy(uri + '/xmlrpc/db')
def get_db_list(self, host, port):
conn = self.get_connection(host, port)
db_list = execute(conn, 'list')
return db_list
def _get_db_name(self, cr, uid, vals, context=None):
# attach_pool = self.pool.get("ir.logging")
dbName = cr.dbname
return dbName
@api.model
def _get_db_name(self):
return self.env.cr.dbname
_columns = {
# Columns local server
'host': fields.char('Host', size=100, required='True'),
'port': fields.char('Port', size=10, required='True'),
'name': fields.char(
'Database', size=100, required='True',
help='Database you want to schedule backups for'
),
'bkp_dir': fields.char(
'Backup Directory', size=100,
help='Absolute path for storing the backups',
required='True'
),
'autoremove': fields.boolean(
'Auto. Remove Backups',
help=(
"If you check this option you can choose to "
"automaticly remove the backup after xx days"
)
),
'daystokeep': fields.integer(
'Remove after x days',
help=(
"Choose after how many days the backup should be "
"deleted. For example:\nIf you fill in 5 the backups "
"will be removed after 5 days."
), required=True
),
# Columns for external server (SFTP)
'sftpwrite': fields.boolean(
'Write to external server with sftp',
help=(
"If you check this option you can specify the details "
"needed to write to a remote server with SFTP."
)
),
'sftppath': fields.char(
'Path external server',
help=(
"The location to the folder where the dumps should be "
"written to. For example /odoo/backups/.\nFiles will then"
" be written to /odoo/backups/ on your remote server."
)
),
'sftpip': fields.char(
'IP Address SFTP Server',
help=(
"The IP address from your remote"
" server. For example 192.168.0.1"
)
),
'sftpport': fields.integer(
"SFTP Port",
help="The port on the FTP server that accepts SSH/SFTP calls."
),
'sftpusername': fields.char(
'Username SFTP Server',
help=(
"The username where the SFTP connection "
"should be made with. This is the user on the external server."
)
),
'sftppassword': fields.char(
'Password User SFTP Server',
help=(
"The password from the user where the SFTP connection "
"should be made with. This is the password from the user"
" on the external server."
)
),
'daystokeepsftp': fields.integer(
'Remove SFTP after x days',
help=(
"Choose after how many days the backup should be deleted "
"from the FTP server. For example:\nIf you fill in 5 the "
"backups will be removed after 5 days from the FTP server."
)
),
'sendmailsftpfail': fields.boolean(
'Auto. E-mail on backup fail', help=(
"If you check this option you can choose to automaticly"
" get e-mailed when the backup to the external server failed."
)
),
'emailtonotify': fields.char(
'E-mail to notify',
help=(
"Fill in the e-mail where you want to be"
" notified that the backup failed on the FTP."
)
),
}
_defaults = {
# 'bkp_dir' : lambda *a : addons_path,
'bkp_dir': '/odoo/backups',
'host': 'localhost',
'port': '8069',
'name': _get_db_name,
'daystokeepsftp': 30,
'sftpport': 22,
}
# Columns local server
host = fields.Char(
string='Host', default='localhost', size=100, required=True)
port = fields.Char(
string='Port', default='8069', size=10, required=True)
name = fields.Char(
string='Database', size=100, required=True,
default=_get_db_name,
help='Database you want to schedule backups for'
)
bkp_dir = fields.Char(
string='Backup Directory', size=100,
default='/odoo/backups',
help='Absolute path for storing the backups',
required=True
)
autoremove = fields.Boolean(
string='Auto. Remove Backups',
help=(
"If you check this option you can choose to "
"automaticly remove the backup after xx days"
)
)
daystokeep = fields.Integer(
string='Remove after x days',
default=30,
help=(
"Choose after how many days the backup should be "
"deleted. For example:\nIf you fill in 5 the backups "
"will be removed after 5 days."
), required=True
)
sftpwrite = fields.Boolean(
string='Write to external server with sftp',
help=(
"If you check this option you can specify the details "
"needed to write to a remote server with SFTP."
)
)
sftppath = fields.Char(
string='Path external server',
help=(
"The location to the folder where the dumps should be "
"written to. For example /odoo/backups/.\nFiles will then"
" be written to /odoo/backups/ on your remote server."
)
)
sftpip = fields.Char(
string='IP Address SFTP Server',
help=(
"The IP address from your remote"
" server. For example 192.168.0.1"
)
)
sftpport = fields.Integer(
string="SFTP Port",
default=22,
help="The port on the FTP server that accepts SSH/SFTP calls."
)
sftpusername = fields.Char(
string='Username SFTP Server',
help=(
"The username where the SFTP connection "
"should be made with. This is the user on the external server."
)
)
sftppassword = fields.Char(
string='Password User SFTP Server',
help=(
"The password from the user where the SFTP connection "
"should be made with. This is the password from the user"
" on the external server."
)
)
daystokeepsftp = fields.Integer(
string='Remove SFTP after x days',
default=30,
help=(
"Choose after how many days the backup should be deleted "
"from the FTP server. For example:\nIf you fill in 5 the "
"backups will be removed after 5 days from the FTP server."
)
)
sendmailsftpfail = fields.Boolean(
string='Auto. E-mail on backup fail',
help=(
"If you check this option you can choose to automaticly"
" get e-mailed when the backup to the external server failed."
)
)
emailtonotify = fields.Char(
string='E-mail to notify',
help=(
"Fill in the e-mail where you want to be"
" notified that the backup failed on the FTP."
)
)
lasterrorlog = fields.Text(
string='E-mail to notify',
help=(
"Fill in the e-mail where you want to be"
" notified that the backup failed on the FTP."
)
)
def _check_db_exist(self, cr, user, ids):
for rec in self.browse(cr, user, ids):
db_list = self.get_db_list(cr, user, ids, rec.host, rec.port)
@api.multi
def _check_db_exist(self):
for rec in self:
db_list = self.get_db_list(rec.host, rec.port)
if rec.name in db_list:
return True
return False
return False
_constraints = [
(_check_db_exist, _('Error ! No such database exists!'), [])
(
_check_db_exist,
_('Error ! No such database exists!'), ['name']
)
]
def test_sftp_connection(self, cr, uid, ids, context=None):
conf_ids = self.search(cr, uid, [])
confs = self.browse(cr, uid, conf_ids)
@api.multi
def test_sftp_connection(self):
confs = self.search([])
# Check if there is a success or fail and write messages
messageTitle = ""
messageContent = ""
@ -211,38 +216,35 @@ class db_backup(osv.Model):
"\nYour IP address seems to be too short.\n")
messageContent += "Here is what we got instead:\n"
if "Failed" in messageTitle:
raise osv.except_osv(
raise except_orm(
_(messageTitle), _(
messageContent + "%s") %
tools.ustr(e))
else:
raise osv.except_osv(_(messageTitle), _(messageContent))
raise Warning(_(messageTitle), _(messageContent))
def schedule_backup(self, cr, user, context={}):
conf_ids = self.search(cr, user, [])
confs = self.browse(cr, user, conf_ids)
for rec in confs:
db_list = self.get_db_list(cr, user, [], rec.host, rec.port)
@api.model
def schedule_backup(self):
for rec in self.search([]):
db_list = self.get_db_list(rec.host, rec.port)
if rec.name in db_list:
file_path = ''
bkp_file = ''
try:
if not os.path.isdir(rec.bkp_dir):
os.makedirs(rec.bkp_dir)
except:
raise
# Create name for dumpfile.
bkp_file = '%s_%s.dump' % (
bkp_file = '%s_%s.dimp.zip' % (
time.strftime('%d_%m_%Y_%H_%M_%S'),
rec.name)
file_path = os.path.join(rec.bkp_dir, bkp_file)
uri = 'http://' + rec.host + ':' + rec.port
conn = xmlrpclib.ServerProxy(uri + '/xmlrpc/db')
conn = self.get_connection(rec.host, rec.port)
bkp = ''
try:
bkp = execute(
conn,
'dump',
tools.config['admin_passwd'],
rec.name)
conn, 'dump', tools.config['admin_passwd'], rec.name)
except:
_logger.notifyChannel(
'backup', netsvc.LOG_INFO,
@ -251,7 +253,7 @@ class db_backup(osv.Model):
"Bad database administrator"
"password for server running at http://%s:%s"
) % (rec.name, rec.host, rec.port))
continue
return False
bkp = base64.decodestring(bkp)
fp = open(file_path, 'wb')
fp.write(bkp)
@ -261,7 +263,7 @@ class db_backup(osv.Model):
'backup', netsvc.LOG_INFO,
"database %s doesn't exist on http://%s:%s" %
(rec.name, rec.host, rec.port))
return False
# Check if user wants to write to SFTP or not.
if rec.sftpwrite is True:
try:
@ -282,7 +284,6 @@ class db_backup(osv.Model):
# user made a typo in his path with multiple slashes
# (/odoo//backups/) it will be fixed by this regex.
pathToWriteTo = re.sub('([/]{2,5})+', '/', pathToWriteTo)
print(pathToWriteTo)
try:
srv.chdir(pathToWriteTo)
except IOError:
@ -308,7 +309,6 @@ class db_backup(osv.Model):
for f in os.listdir(dir):
fullpath = os.path.join(dir, f)
if os.path.isfile(fullpath):
print(fullpath)
srv.put(fullpath)
# Navigate in to the correct folder.
@ -319,19 +319,23 @@ class db_backup(osv.Model):
for file in srv.listdir(pathToWriteTo):
# Get the full path
fullpath = os.path.join(pathToWriteTo, file)
# Get the timestamp from the file on the external
# server
timestamp = srv.stat(fullpath).st_atime
createtime = datetime.datetime.fromtimestamp(timestamp)
now = datetime.datetime.now()
delta = now - createtime
# If the file is older than the daystokeepsftp (the
# days to keep that the user filled in on the Odoo form
# it will be removed.
if delta.days >= rec.daystokeepsftp:
# Only delete files, no directories!
if srv.isfile(fullpath) and ".dump" in file:
print("Delete: " + file)
if srv.isfile(fullpath) and ".dump.zip" in file:
# Get the timestamp from the file on the external
# server
timestamp = srv.stat(fullpath).st_atime
createtime = (
datetime.datetime.fromtimestamp(timestamp)
)
now = datetime.datetime.now()
delta = now - createtime
# If the file is older than the daystokeepsftp (the
# days to keep that the user filled in on the Odoo
# form it will be removed.
if (
rec.daystokeepsftp > 0 and
delta.days >= rec.daystokeepsftp
):
# Only delete files, no directories!
srv.unlink(file)
# Close the SFTP session.
srv.close()
@ -345,25 +349,13 @@ class db_backup(osv.Model):
# an e-mail notification about this.
if rec.sendmailsftpfail:
try:
ir_mail_server = self.pool.get('ir.mail_server')
message = (
"Dear,\n\nThe backup for the server %s"
" (IP: %s) failed.Please check"
" the following details:\n\n"
"IP address SFTP server: %s \nUsername: %s"
"\nPassword: %s"
"\n\nError details: %s \n\nWith kind regards"
) % (
rec.host, rec.sftpip, rec.sftpip,
rec.sftpusername, rec.sftppassword,
tools.ustr(e)
self.write({'lasterrorlog': tools.ustr(e)})
abk_template = self.env.ref(
'auto_backup.'
'email_template_autobackup_error_noificaiton',
False
)
msg = ir_mail_server.build_email(
"auto_backup@" + rec.name + ".com",
[rec.emailtonotify],
"Backup from " + rec.host + "(" + rec.sftpip +
") failed", message)
ir_mail_server.send_email(cr, user, msg)
abk_template.send_mail(self.id)
except Exception:
pass
@ -383,17 +375,16 @@ class db_backup(osv.Model):
dir = rec.bkp_dir
# Loop over all files in the directory.
for f in os.listdir(dir):
fullpath = os.path.join(dir, f)
timestamp = os.stat(fullpath).st_ctime
createtime = datetime.datetime.fromtimestamp(timestamp)
now = datetime.datetime.now()
delta = now - createtime
if delta.days >= rec.daystokeep:
# Only delete files (which are .dump), no directories.
if os.path.isfile(fullpath) and ".dump" in f:
print("Delete: " + fullpath)
if os.path.isfile(fullpath) and ".dump.zip" in f:
fullpath = os.path.join(dir, f)
timestamp = os.stat(fullpath).st_ctime
createtime = (
datetime.datetime.fromtimestamp(timestamp)
)
now = datetime.datetime.now()
delta = now - createtime
if delta.days >= rec.daystokeep:
os.remove(fullpath)
db_backup()
return True
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

2
auto_backup/security/ir.model.access.csv

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_db_backup,access_db_backup,model_db_backup,,1,0,0,0

22
auto_backup/tests/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Agile Business Group <http://www.agilebg.com>
# Copyright (C) 2015 Alessio Gerace <alesiso.gerace@agilebg.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
from . import test_auto_backup

64
auto_backup/tests/test_auto_backup.py

@ -0,0 +1,64 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# Copyright 2015 Agile Business Group <http://www.agilebg.com>
# Copyright (C) 2015 Alessio Gerace <alesiso.gerace@agilebg.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import base64
from openerp.tests import common
from openerp.exceptions import except_orm, Warning
from openerp.modules.module import get_module_resource
import os
import time
from datetime import datetime, date, timedelta
class TestsAutoBackup(common.TransactionCase):
def setUp(self):
super(TestsAutoBackup, self).setUp()
self.abk_model = self.env["db.backup"]
self.cron_model = self.env["ir.cron"]
def test_0(self):
with self.assertRaises(except_orm):
self.abk_model.create({'name': 'abcd'})
def test_1(self):
this = self.abk_model.create(
{
'bkp_dir': '/tmp'
}
)
self.assertEqual(this.host, 'localhost')
cronbk = self.cron_model.search([('name', '=', 'Backup scheduler')])
import pdb;pdb.set_trace()
cronbk.write(
{
'active': True,
'doall': True
}
)
filetime = (
datetime.now() + timedelta(minutes=1)
).strftime('%d_%m_%Y_%H_%M_%S')
bkp_file = '%s_%s.dimp.zip' % (
filetime, this.name)
file_path = os.path.join(this.bkp_dir, bkp_file)
self.assertEqual(os.path.isfile(file_path), True)
Loading…
Cancel
Save