You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							115 lines
						
					
					
						
							5.4 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							115 lines
						
					
					
						
							5.4 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################### | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Aslam AK (odoo@cybrosys.com) | |
| # | |
| #    You can modify it under the terms of the GNU LESSER | |
| #    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | |
| # | |
| #    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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | |
| #    (LGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################### | |
| import ftplib | |
| import gdown | |
| import os | |
| import paramiko | |
| import requests | |
| import tempfile | |
| import odoo | |
| import odoo.modules.registry | |
| from odoo import fields, models | |
| from odoo.exceptions import UserError | |
| from odoo.http import dispatch_rpc | |
| from odoo.service import db | |
| from odoo.tools.misc import str2bool | |
| 
 | |
| 
 | |
| class DataBaseRestore(models.TransientModel): | |
|     """ Database Restore Model """ | |
|     _name = "database.restore" | |
|     _description = "Database Restore" | |
| 
 | |
|     db_file = fields.Char(string="File", help="Restore database file") | |
|     db_name = fields.Char(string="Database Name", help="Name of the database") | |
|     db_master_pwd = fields.Char(string="Database Master Password", | |
|                                 help="Master Password to restore database") | |
|     backup_location = fields.Char(string="Backup Location", | |
|                                   help="Database backup location") | |
| 
 | |
|     def action_restore_database(self, copy=False): | |
|         """ Function to restore the database Backup """ | |
|         # Check if the admin password is insecure and update it if provided | |
|         insecure = odoo.tools.config.verify_admin_password('admin') | |
|         if insecure and self.db_master_pwd: | |
|             dispatch_rpc('db', 'change_admin_password', | |
|                          ["admin", self.db_master_pwd]) | |
|         try: | |
|             # Check if the admin password is correct and proceed with the | |
|             # restore process | |
|             db.check_super(self.db_master_pwd) | |
|             # Create a temporary file to store the downloaded backup data | |
|             temp_file = tempfile.NamedTemporaryFile(delete=False) | |
|             if self.backup_location == 'Google Drive': | |
|                 # Retrieve backup from Google Drive using gdown library | |
|                 gdown.download(self.db_file, temp_file.name, quiet=False) | |
|             elif self.backup_location in ['Dropbox', 'OneDrive', 'Nextcloud', 'AmazonS3']: | |
|                 # Retrieve backup from Dropbox or OneDrive using requests | |
|                 # library | |
|                 response = requests.get(self.db_file, stream=True) | |
|                 temp_file.write(response.content) | |
|             elif self.backup_location == 'FTP Storage': | |
|                 # Retrieve backup from FTP Storage using ftplib | |
|                 for rec in self.env['db.backup.configure'].search([]): | |
|                     if rec.backup_destination == 'ftp' and rec.ftp_path == \ | |
|                             os.path.dirname(self.db_file): | |
|                         ftp_server = ftplib.FTP() | |
|                         ftp_server.connect(rec.ftp_host, int(rec.ftp_port)) | |
|                         ftp_server.login(rec.ftp_user, rec.ftp_password) | |
|                         ftp_server.retrbinary("RETR " + self.db_file, | |
|                                               temp_file.write) | |
|                         temp_file.seek(0) | |
|                         ftp_server.quit() | |
|             elif self.backup_location == 'SFTP Storage': | |
|                 # Retrieve backup from SFTP Storage using paramiko | |
|                 for rec in self.env['db.backup.configure'].search([]): | |
|                     if rec.backup_destination == 'sftp' and rec.sftp_path == \ | |
|                             os.path.dirname(self.db_file): | |
|                         sftp_client = paramiko.SSHClient() | |
|                         sftp_client.set_missing_host_key_policy( | |
|                             paramiko.AutoAddPolicy()) | |
|                         sftp_client.connect(hostname=rec.sftp_host, | |
|                                             username=rec.sftp_user, | |
|                                             password=rec.sftp_password, | |
|                                             port=rec.sftp_port) | |
|                         sftp_server = sftp_client.open_sftp() | |
|                         sftp_server.getfo(self.db_file, temp_file) | |
|                         sftp_server.close() | |
|                         sftp_client.close() | |
|             elif self.backup_location == 'Local Storage': | |
|                 # If the backup is stored in the local storage, set the temp | |
|                 # file's name accordingly | |
|                 temp_file.name = self.db_file | |
|             # Restore the database using Odoo's 'restore_db' method | |
|             db.restore_db(self.db_name, temp_file.name, str2bool(copy)) | |
|             temp_file.close() | |
|             # Redirect the user to the Database Manager after successful | |
|             # restore | |
|             return { | |
|                 'type': 'ir.actions.act_url', | |
|                 'url': '/web/database/manager' | |
|             } | |
|         except Exception as e: | |
|             # Raise a UserError if any error occurs during the database | |
|             # restore process | |
|             raise UserError( | |
|                 "Database re2store error: %s" % (str(e) or repr(e)))
 | |
| 
 |