예제 #1
0
    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
예제 #2
0
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:
예제 #3
0
파일: worker.py 프로젝트: acsone/connector
    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
예제 #4
0
    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
예제 #5
0
 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)
예제 #6
0
 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
예제 #8
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
예제 #9
0
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
예제 #10
0
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
예제 #11
0
    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}