def get_s3_conf(cfg, section): key_id = cfg.get(section, 'key_id') key = cfg.get(section, 'key') bucket = cfg.get(section, 'bucket') host = None port = None if cfg.has_option(section, 'host'): addr = cfg.get(section, 'host') if ':' not in addr: raise InvalidConfigError('invalid s3 host %s' % addr) segs = addr.split(':') if len(segs) != 2: raise InvalidConfigError('invalid s3 host %s' % addr) host = segs[0] try: port = int(segs[1]) except ValueError: raise InvalidConfigError('invalid s3 host %s' % addr) from seafobj.backends.s3 import S3Conf conf = S3Conf(key_id, key, bucket, host, port) return conf
def get_obj_stores(self, obj_type): try: if self.obj_stores[obj_type]: return self.obj_stores[obj_type] except KeyError: raise RuntimeError('unknown obj_type ' + obj_type) for bend in self.json_cfg: storage_id = bend['storage_id'] crypto = self.seafile_cfg.get_seaf_crypto() compressed = obj_type == 'fs' if bend[obj_type]['backend'] == 'fs': obj_dir = os.path.join(bend[obj_type]['dir'], 'storage', obj_type) self.obj_stores[obj_type][storage_id] = SeafObjStoreFS(compressed, obj_dir, crypto) elif bend[obj_type]['backend'] == 'swift': from seafobj.backends.swift import SeafObjStoreSwift swift_conf = get_swift_conf_from_json(bend[obj_type]) self.obj_stores[obj_type][storage_id] = SeafObjStoreSwift(compressed, swift_conf, crypto) elif bend[obj_type]['backend'] == 's3': from seafobj.backends.s3 import SeafObjStoreS3 s3_conf = get_s3_conf_from_json(bend[obj_type]) self.obj_stores[obj_type][storage_id] = SeafObjStoreS3(compressed, s3_conf, crypto) else: raise InvalidConfigError('Unknown backend type: %s.' % bend[obj_type]['backend']) if bend.has_key('is_default') and bend['is_default']==True: if self.obj_stores[obj_type].has_key('__default__'): raise InvalidConfigError('Only one default backend can be set.') self.obj_stores[obj_type]['__default__'] = self.obj_stores[obj_type][storage_id] return self.obj_stores[obj_type]
def get_config_parser(self): if self.cfg is None: self.cfg = ConfigParser.ConfigParser() try: self.cfg.read(self.seafile_conf) except Exception, e: raise InvalidConfigError(str(e))
def get_s3_conf(cfg, section): key_id = cfg.get(section, 'key_id') key = cfg.get(section, 'key') bucket = cfg.get(section, 'bucket') host = None port = None if cfg.has_option(section, 'host'): addr = cfg.get(section, 'host') segs = addr.split(':') host = segs[0] try: port = int(segs[1]) except IndexError: pass use_v4_sig = False if cfg.has_option(section, 'use_v4_signature'): use_v4_sig = cfg.getboolean(section, 'use_v4_signature') aws_region = None if use_v4_sig: if not cfg.has_option(section, 'aws_region'): raise InvalidConfigError('aws_region is not configured') aws_region = cfg.get(section, 'aws_region') from seafobj.backends.s3 import S3Conf conf = S3Conf(key_id, key, bucket, host, port, use_v4_sig, aws_region) return conf
def get_obj_store(self, obj_type): '''Return an implementation of SeafileObjStore''' cfg = self.seafile_cfg.get_config_parser() try: section = self.obj_section_map[obj_type] except KeyError: raise RuntimeError('unknown obj_type ' + obj_type) if cfg.has_option(section, 'name'): backend_name = cfg.get(section, 'name') else: backend_name = 'fs' compressed = obj_type == 'fs' if backend_name == 'fs': obj_dir = os.path.join(self.seafile_cfg.get_seafile_storage_dir(), obj_type) return SeafObjStoreFS(compressed, obj_dir) elif backend_name == 's3': # We import s3 backend here to avoid depenedency on boto for users # not using s3 from seafobj.backends.s3 import SeafObjStoreS3 s3_conf = get_s3_conf(cfg, section) return SeafObjStoreS3(compressed, s3_conf) elif backend_name == 'ceph': # We import ceph backend here to avoid depenedency on rados for # users not using rados from seafobj.backends.ceph import SeafObjStoreCeph ceph_conf = get_ceph_conf(cfg, section) return SeafObjStoreCeph(compressed, ceph_conf) else: raise InvalidConfigError('unknown %s backend "%s"' % (obj_type, backend_name))
def get_seaf_crypto(self): if not self.cfg.has_option('store_crypt', 'key_path'): return None key_path = self.cfg.get('store_crypt', 'key_path') if not os.path.exists(key_path): raise InvalidConfigError('key file %s doesn\'t exist' % key_path) key_config = ConfigParser.ConfigParser() key_config.read(key_path) if not key_config.has_option('store_crypt', 'enc_key') or not \ key_config.has_option('store_crypt', 'enc_iv'): raise InvalidConfigError('Invalid key file %s: incomplete info' % key_path) hex_key = key_config.get('store_crypt', 'enc_key') hex_iv = key_config.get('store_crypt', 'enc_iv') raw_key = binascii.a2b_hex(hex_key) raw_iv = binascii.a2b_hex(hex_iv) from seafobj.utils.crypto import SeafCrypto return SeafCrypto(raw_key, raw_iv)
def get_s3_conf_from_json(cfg): key_id = cfg['key_id'] key = cfg['key'] bucket = cfg['bucket'] host = None port = None if 'host' in cfg: addr = cfg['host'] segs = addr.split(':') host = segs[0] try: port = int(segs[1]) except IndexError: pass use_v4_sig = False if 'use_v4_signature' in cfg: use_v4_sig = cfg['use_v4_signature'] aws_region = None if use_v4_sig: if 'aws_region' not in cfg: raise InvalidConfigError('aws_region is not configured') aws_region = cfg['aws_region'] use_https = False if 'use_https' in cfg: if str(cfg['use_https']).lower().strip() == 'true': use_https = True path_style_request = False if 'path_style_request' in cfg: path_style_request = cfg['path_style_request'] from seafobj.backends.s3 import S3Conf conf = S3Conf(key_id, key, bucket, host, port, use_v4_sig, aws_region, use_https, path_style_request) return conf
def get_s3_conf_from_json(cfg): key_id = cfg['key_id'] key = cfg['key'] bucket = cfg['bucket'] host = None port = None if cfg.has_key('host'): addr = cfg['host'] segs = addr.split(':') host = segs[0] try: port = int(segs[1]) except IndexError: pass use_v4_sig = False if cfg.has_key('use_v4_signature'): use_v4_sig = cfg['use_v4_signature'] aws_region = None if use_v4_sig: if not cfg.has_key('aws_region'): raise InvalidConfigError('aws_region is not configured') aws_region = cfg('aws_region') use_https = False if cfg.has_key('use_https'): use_https = cfg['use_https'] path_style_request = False if cfg.has_key('path_style_request'): path_style_request = cfg['path_style_request'] from seafobj.backends.s3 import S3Conf conf = S3Conf(key_id, key, bucket, host, port, use_v4_sig, aws_region, use_https, path_style_request) return conf