def db_list(self): """Get the list of available databases, with FTPd support """ # s = netsvc.ExportService.getService('db') result = DB.exp_list(document=True) self.db_name_list = [] for db_name in result: db, cr = None, None try: try: # db = openerp.modules.registry.RegistryManager.get(db) # db = sql_db.db_connect(db_name) db = openerp.sql_db.db_connect(db_name) cr = db.cursor() cr.execute( "SELECT 1 FROM pg_class WHERE relkind = 'r' AND relname = 'ir_module_module'" ) if not cr.fetchone(): continue cr.execute( "SELECT id FROM ir_module_module WHERE name = 'document_ftp' AND state IN ('installed', 'to install', 'to upgrade') " ) res = cr.fetchone() if res and len(res): self.db_name_list.append(db_name) cr.commit() except Exception: self._log.warning('Cannot use db "%s".', db_name) finally: if cr is not None: cr.close() return self.db_name_list
def exp_drop(db_name): """Monkeypatched to delete cloud container instead of filesystem directory""" if db_name not in exp_list(True): return False # Determine storage "on foot" with raw SQL (while the database is still there) db = openerp.sql_db.db_connect(db_name) with closing(db.cursor()) as cr: cr.execute("""SELECT value FROM ir_config_parameter WHERE key='ir_attachment.location'""") result = cr.dictfetchone() storage = result and result['value'] or 'file' if storage == 'openstack': cr.execute( """SELECT value FROM ir_config_parameter WHERE key='ir_attachment.location.openstack'""" ) result = cr.dictfetchone() config_params = result and json.loads(result['value']) openerp.modules.registry.RegistryManager.delete(db_name) openerp.sql_db.close_db(db_name) db = openerp.sql_db.db_connect('postgres') with closing(db.cursor()) as cr: cr.autocommit(True) # avoid transaction block _drop_conn(cr, db_name) try: cr.execute('DROP DATABASE "%s"' % db_name) except Exception, e: _logger.error('DROP DB: %s failed:\n%s', db_name, e) raise Exception("Couldn't drop database %s: %s" % (db_name, e)) else:
def available_db_names(): """ Returns the databases for the server having the connector module installed. Available means that they can be used by a `Worker`. :return: database names :rtype: list """ if config['db_name']: db_names = config['db_name'].split(',') else: db_names = db.exp_list(True) available_db_names = [] for db_name in db_names: session_hdl = ConnectorSessionHandler(db_name, openerp.SUPERUSER_ID) with session_hdl.session() as session: cr = session.cr try: cr.execute("SELECT 1 FROM ir_module_module " "WHERE name = %s " "AND state = %s", ('connector', 'installed'), log_exceptions=False) except ProgrammingError as err: if unicode(err).startswith('relation "ir_module_module"' ' does not exist'): _logger.debug('Database %s is not an OpenERP database,' ' connector worker not started', db_name) else: raise else: if cr.fetchone(): available_db_names.append(db_name) return available_db_names
def db_list(self): """Get the list of available databases, with FTPd support """ # s = netsvc.ExportService.getService('db') result = DB.exp_list(document=True) self.db_name_list = [] for db_name in result: db, cr = None, None try: try: # db = openerp.modules.registry.RegistryManager.get(db) # db = sql_db.db_connect(db_name) db = openerp.sql_db.db_connect(db_name) cr = db.cursor() cr.execute("SELECT 1 FROM pg_class WHERE relkind = 'r' AND relname = 'ir_module_module'") if not cr.fetchone(): continue cr.execute("SELECT id FROM ir_module_module WHERE name = 'document_ftp' AND state IN ('installed', 'to install', 'to upgrade') ") res = cr.fetchone() if res and len(res): self.db_name_list.append(db_name) cr.commit() except Exception: self._log.warning('Cannot use db "%s".', db_name) finally: if cr is not None: cr.close() return self.db_name_list
def run_autobackup_database(self, cr, uid, context=None): user = self.browse(cr, SUPERUSER_ID, uid, context) host = '127.0.0.1' port = '8021' foldername = '' ftp_url = (user.company_id.document_ftp_url).replace('ftp://','') ftp_user = user.company_id.document_ftp_user ftp_passwd = user.company_id.document_ftp_passwd for url in ftp_url.split('/'): if url.find(':') > 0: host, port = url.split(':')[0], url.split(':')[1] else: foldername += '/'+ url db_list = DB.exp_list() for db in db_list: backup_db = StringIO(DB.exp_dump(db)) values = { 'host': str(host), 'port': str(port), 'timeout': 10.0, 'foldername': foldername, 'backup_db': backup_db, 'ftp_user': ftp_user, 'ftp_passwd': ftp_passwd, 'db_name': db, } self.get_ftp(cr, uid, values, context)
def run_autobackup_database(self, cr, uid, context=None): _logger.info("Auto Backup Starts...") user = self.browse(cr, SUPERUSER_ID, uid, context) host = '127.0.0.1' port = '8021' foldername = '' ftp_url = (user.company_id.document_ftp_url).replace('ftp://', '') ftp_user = user.company_id.document_ftp_user ftp_passwd = user.company_id.document_ftp_passwd for url in ftp_url.split('/'): if url.find(':') > 0: host, port = url.split(':')[0], url.split(':')[1] else: foldername += '/' + url db_list = DB.exp_list() for db in db_list: backup_db = DB.exp_dump(db) values = { 'host': str(host), 'port': str(port), 'timeout': 10.0, 'foldername': foldername, 'backup_db': backup_db, 'ftp_user': ftp_user, 'ftp_passwd': ftp_passwd, 'db_name': db, } self.get_ftp(cr, uid, values, context) _logger.info("Auto Backup Completed...")
def copy_existing_database(session, args): """ Depending on the --no-copy argument either drop existing database or rename it. :param session: :type session: anybox.recipe.openerp.runtime.session :return: :rtype: """ db_list = exp_list() if args.db_name in db_list: if args.no_copy: exp_drop(args.db_name) return 0 else: now = datetime.datetime.now().strftime('%Y%m%d%H%M%S') current_tag = get_current_git_tag() current_tag = '__%s' % current_tag if current_tag else '' archive_db_name = "%s__%s%s" % (args.db_name, now, current_tag,) exp_rename(args.db_name, archive_db_name) # Be aware that rename preserve filestore else: print "Database '%s' does not exist" % args.db_name return 0
def available_db_names(): """ Returns the databases for the server having the connector module installed. Available means that they can be used by a `Worker`. :return: database names :rtype: list """ if config['db_name']: db_names = config['db_name'].split(',') else: db_names = db.exp_list(True) dbfilter = config['dbfilter'] if dbfilter and db_names: db_names = [d for d in db_names if re.match(dbfilter, d)] available_db_names = [] for db_name in db_names: session_hdl = ConnectorSessionHandler(db_name, openerp.SUPERUSER_ID) with session_hdl.session() as session: cr = session.cr try: cr.execute( "SELECT 1 FROM ir_module_module " "WHERE name = %s " "AND state = %s", ('connector', 'installed'), log_exceptions=False) except ProgrammingError as err: no_db_error = 'relation "ir_module_module" does not exist' if unicode(err).startswith(no_db_error): _logger.debug( 'Database %s is not an OpenERP database,' ' connector worker not started', db_name) else: raise else: if cr.fetchone(): available_db_names.append(db_name) return available_db_names
def get_registry_cr_uid_context(db_name): if db.exp_list(): registry = RegistryManager.get(db_name) cr = registry.cursor() context = registry['res.users'].context_get(cr, SUPERUSER_ID) return registry, cr, SUPERUSER_ID, context
def get_registry_cr_uid_context(db_name): if db.exp_list(): registry = RegistryManager.get(db_name) cr = registry.cursor() context = registry['res.users'].context_get(cr, SUPERUSER_ID) return registry, cr, SUPERUSER_ID, context
def restore_db( self, admin_pass, db_name, file_path, file_name, backups_state, remote_server=False, overwrite=False): _logger.info("Starting restore process with data:\n\ * db_name: %s\n\ * file_path: %s\n\ * file_name: %s\n\ * backups_state: %s\n\ * remote_server: %s\n\ " % (db_name, file_path, file_name, backups_state, remote_server)) database_file = os.path.join(file_path, file_name) if remote_server: local_path = '/opt/odoo/backups/tmp/' user_name = remote_server.get('user_name') password = remote_server.get('password') host_string = remote_server.get('host_string') port = remote_server.get('port') if not user_name or not password or not host_string or not port: return {'error': 'You need user_name, password, host_string\ and port in order to use remote_server'} env.user = user_name env.password = password env.host_string = host_string env.port = port _logger.info("Getting file '%s' from '%s:%s' with user %s" % ( database_file, host_string, port, user_name)) res = get( remote_path=database_file, local_path=local_path, use_sudo=True) if not res.succeeded: return {'error': 'Could not copy file from remote server'} database_file = os.path.join(local_path, file_name) _logger.info( "Restoring database %s from %s" % (db_name, database_file)) error = False if overwrite: if db_name not in db_ws.exp_list(True): _logger.info( "Overwrite argument passed but db %s not found, " "avoiding db drop" % db_name) else: # if overwrite, then we delete actual db first _logger.info( "Overwrite argument passed, deleting db %s" % db_name) if zipfile.is_zipfile(database_file): # if zip, then we just use dropd db_ws.exp_drop(db_name) _logger.info("Db %s deleted completely" % db_name) else: # if not zip, we keep filestore exp_drop_only_db(db_name) _logger.info( "Db %s deleted (only db, no filestore)" % db_name) try: _logger.info("Reading file for restore") f = file(database_file, 'r') data_b64 = base64.encodestring(f.read()) f.close() except Exception, e: error = (_( 'Unable to read file %s\n\ This is what we get: \n %s') % ( database_file, e)) return {'error': error}