extra access for db backup

This commit is contained in:
Ivan Office
2025-02-12 19:19:43 +08:00
parent eb7d94d22a
commit f6d039100c
3 changed files with 54 additions and 25 deletions

View File

@@ -4,10 +4,10 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Odoo Server 16.0+e-20231112\n" "Project-Id-Version: Odoo Server 16.0+e-20241226\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-07-23 08:20+0000\n" "POT-Creation-Date: 2025-02-12 11:14+0000\n"
"PO-Revision-Date: 2024-07-23 08:20+0000\n" "PO-Revision-Date: 2025-02-12 11:14+0000\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: \n" "Language-Team: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -149,6 +149,11 @@ msgstr "创建者"
msgid "Created on" msgid "Created on"
msgstr "创建时间" msgstr "创建时间"
#. module: app_auto_backup
#: model:ir.model.fields.selection,name:app_auto_backup.selection__db_backup__backup_type__dump
msgid "Data pg_dump (without filestore)"
msgstr "仅数据备份(不含文件资源)"
#. module: app_auto_backup #. module: app_auto_backup
#: model:ir.model.fields,field_description:app_auto_backup.field_db_backup__name #: model:ir.model.fields,field_description:app_auto_backup.field_db_backup__name
msgid "Database" msgid "Database"
@@ -187,11 +192,6 @@ msgstr "显示名称"
msgid "Download File" msgid "Download File"
msgstr "下载文件" msgstr "下载文件"
#. module: app_auto_backup
#: model:ir.model.fields.selection,name:app_auto_backup.selection__db_backup__backup_type__dump
msgid "Dump"
msgstr ""
#. module: app_auto_backup #. module: app_auto_backup
#: model:ir.model.fields,field_description:app_auto_backup.field_db_backup__email_to_notify #: model:ir.model.fields,field_description:app_auto_backup.field_db_backup__email_to_notify
msgid "E-mail to notify" msgid "E-mail to notify"
@@ -209,6 +209,13 @@ msgstr "文件路径"
msgid "File Path or URL not found." msgid "File Path or URL not found."
msgstr "无法找到该文件路径或URL" msgstr "无法找到该文件路径或URL"
#. module: app_auto_backup
#. odoo-python
#: code:addons/app_auto_backup/controllers/main.py:0
#, python-format
msgid "File not found for user."
msgstr "没有找到合适此用户的文件。"
#. module: app_auto_backup #. module: app_auto_backup
#: model:ir.model.fields,help:app_auto_backup.field_db_backup__email_to_notify #: model:ir.model.fields,help:app_auto_backup.field_db_backup__email_to_notify
msgid "" msgid ""
@@ -445,5 +452,10 @@ msgstr "SFtp备份至远程服务器"
#. module: app_auto_backup #. module: app_auto_backup
#: model:ir.model.fields.selection,name:app_auto_backup.selection__db_backup__backup_type__zip #: model:ir.model.fields.selection,name:app_auto_backup.selection__db_backup__backup_type__zip
msgid "Zip" msgid "Zip Data and Filestore)"
msgstr "Zip压缩包" msgstr "Zip数据及文件"
#. module: app_auto_backup
#: model:ir.model.fields,help:app_auto_backup.field_db_backup__host
msgid "please input the full url. like https://www.odooai.cn"
msgstr "请输入能访问odoo的完整url。如 https://www.odooai.cn"

View File

@@ -7,6 +7,7 @@ import shutil
import subprocess import subprocess
import json import json
import tempfile import tempfile
import zipfile
from odoo import models, fields, api, tools, _ from odoo import models, fields, api, tools, _
from odoo.exceptions import Warning, AccessDenied from odoo.exceptions import Warning, AccessDenied
@@ -40,7 +41,8 @@ class DbBackup(models.Model):
default=_get_db_name) default=_get_db_name)
folder = fields.Char('Backup Directory', help='Absolute path for storing the backups', required=True, folder = fields.Char('Backup Directory', help='Absolute path for storing the backups', required=True,
default=lambda self: self._get_default_folder()) default=lambda self: self._get_default_folder())
backup_type = fields.Selection([('zip', 'Zip'), ('dump', 'Dump')], 'Backup Type', required=True, default='zip') backup_type = fields.Selection([('zip', 'Zip Data and Filestore)'), ('dump', 'Data pg_dump (without filestore)')],
string='Backup Type', required=True, default='dump')
autoremove = fields.Boolean('Auto. Remove Backups', autoremove = fields.Boolean('Auto. Remove Backups',
help='If you check this option you can choose to automaticly remove the backup ' help='If you check this option you can choose to automaticly remove the backup '
'after xx days') 'after xx days')
@@ -137,9 +139,8 @@ class DbBackup(models.Model):
bkp_file = '%s_%s.%s' % (time.strftime('%Y_%m_%d_%H_%M_%S'), rec.name, rec.backup_type) bkp_file = '%s_%s.%s' % (time.strftime('%Y_%m_%d_%H_%M_%S'), rec.name, rec.backup_type)
file_path = os.path.join(rec.folder, bkp_file) file_path = os.path.join(rec.folder, bkp_file)
uri = rec.host uri = rec.host
if uri.startswith('http') or uri.startswith('https'): if uri.startswith('http') or uri.startswith('https'):
uri = rec.host pass
else: else:
uri = 'http://' + rec.host + ':' + rec.port uri = 'http://' + rec.host + ':' + rec.port
bkp = '' bkp = ''
@@ -158,7 +159,7 @@ class DbBackup(models.Model):
except Exception as error: except Exception as error:
_logger.warning( _logger.warning(
"Couldn't backup database %s. Bad database administrator password for server running at " "Couldn't backup database %s. Bad database administrator password for server running at "
"http://%s:%s" % (rec.name, uri, rec.port)) "http://%s:%s error: %s" % (rec.name, rec.host, rec.port, error))
_logger.warning("Exact error from the exception: %s", str(error)) _logger.warning("Exact error from the exception: %s", str(error))
continue continue
@@ -311,6 +312,7 @@ class DbBackup(models.Model):
env = exec_pg_environ() env = exec_pg_environ()
if backup_format == 'zip': if backup_format == 'zip':
# todo: 排除掉backup目录
with tempfile.TemporaryDirectory() as dump_dir: with tempfile.TemporaryDirectory() as dump_dir:
filestore = odoo.tools.config.filestore(db_name) filestore = odoo.tools.config.filestore(db_name)
if os.path.exists(filestore): if os.path.exists(filestore):
@@ -322,20 +324,12 @@ class DbBackup(models.Model):
cmd.insert(-1, '--file=' + os.path.join(dump_dir, 'dump.sql')) cmd.insert(-1, '--file=' + os.path.join(dump_dir, 'dump.sql'))
subprocess.run(cmd, env=env, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, check=True) subprocess.run(cmd, env=env, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT, check=True)
if stream: if stream:
odoo.tools.osutil.zip_dir(dump_dir, stream, include_dir=False, fnct_sort=lambda file_name: file_name != 'dump.sql') self.zip_dir_pro(dump_dir, stream, include_dir=False, fnct_sort=lambda file_name: file_name != 'dump.sql')
else: else:
t=tempfile.TemporaryFile() t=tempfile.TemporaryFile()
odoo.tools.osutil.zip_dir(dump_dir, t, include_dir=False, fnct_sort=lambda file_name: file_name != 'dump.sql') self.zip_dir_pro(dump_dir, t, include_dir=False, fnct_sort=lambda file_name: file_name != 'dump.sql')
t.seek(0) t.seek(0)
return t return t
# odoo.tools.exec_pg_command(*cmd)
# if stream:
# odoo.tools.osutil.zip_dir(dump_dir, stream, include_dir=False, fnct_sort=lambda file_name: file_name != 'dump.sql')
# else:
# t=tempfile.TemporaryFile()
# odoo.tools.osutil.zip_dir(dump_dir, t, include_dir=False, fnct_sort=lambda file_name: file_name != 'dump.sql')
# t.seek(0)
# return t
else: else:
cmd.insert(-1, '--format=c') cmd.insert(-1, '--format=c')
stdin, stdout = odoo.tools.exec_pg_command_pipe(*cmd) stdin, stdout = odoo.tools.exec_pg_command_pipe(*cmd)
@@ -377,3 +371,27 @@ class DbBackup(models.Model):
if cron: if cron:
cron.method_direct_trigger() cron.method_direct_trigger()
return True return True
def zip_dir_pro(self, path, stream, include_dir=True, fnct_sort=None):
"""
增加的要排除的文件,主要是 xxxdump.zip及整个目录
"""
path = os.path.normpath(path)
len_prefix = len(os.path.dirname(path)) if include_dir else len(path)
if len_prefix:
len_prefix += 1
with zipfile.ZipFile(stream, 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=True) as zipf:
for dirpath, dirnames, filenames in os.walk(path):
filenames = sorted(filenames, key=fnct_sort)
for fname in filenames:
if fname.find('dump.zip') != -1:
continue
if fname.find(self.folder) != -1:
continue
bname, ext = os.path.splitext(fname)
ext = ext or bname
if ext not in ['.pyc', '.pyo', '.swp', '.DS_Store']:
path = os.path.normpath(os.path.join(dirpath, fname))
if os.path.isfile(path):
zipf.write(path, path[len_prefix:])

View File

@@ -1,4 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
admin_access, db_backup admin access,model_db_backup,base.group_no_one,1,1,1,1
admin_security_rule, Model db_backup admin access,model_db_backup,app_auto_backup.group_manager,1,1,1,1 admin_security_rule, Model db_backup admin access,model_db_backup,app_auto_backup.group_manager,1,1,1,1
admin_db_backup_details, Model db_backup_details admin access,model_db_backup_details,app_auto_backup.group_manager,1,1,1,1 admin_db_backup_details, Model db_backup_details admin access,model_db_backup_details,app_auto_backup.group_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
admin_access db_backup admin access model_db_backup base.group_no_one 1 1 1 1
2 admin_security_rule Model db_backup admin access model_db_backup app_auto_backup.group_manager 1 1 1 1
3 admin_db_backup_details Model db_backup_details admin access model_db_backup_details app_auto_backup.group_manager 1 1 1 1