def _datadirs(self, config, repo=None): if repo is None: repo = config.repository() if config._cubes is None: # web only config config.init_cubes(repo.get_cubes()) for cube in repo.get_cubes(): cube_datadir = osp.join(cwcfg.cube_dir(cube), 'data') if osp.isdir(cube_datadir): yield cube_datadir yield _DATA_DIR
def i18nupgrade(self, config): # handle i18n upgrade: # * install new languages # * recompile catalogs # XXX search available language in the first cube given from cubicweb import i18n templdir = cwcfg.cube_dir(config.cubes()[0]) langs = [lang for lang, _ in i18n.available_catalogs(join(templdir, 'i18n'))] errors = config.i18ncompile(langs) if errors: print('\n'.join(errors)) if not ASK.confirm('Error while compiling message catalogs, ' 'continue anyway?'): print('-> migration not completed.') return False return True
def run(self, args): """run the command with its specific arguments""" from logilab.common.textutils import splitstrip check_options_consistency(self.config) configname = self.config.config cubes, appid = args cubes = splitstrip(cubes) # get the configuration and helper config = cwcfg.config_for(appid, configname, creating=True) cubes = config.expand_cubes(cubes) config.init_cubes(cubes) helper = self.config_helper(config) # check the cube exists try: templdirs = [cwcfg.cube_dir(cube) for cube in cubes] except ConfigurationError as ex: print(ex) print('\navailable cubes:', end=' ') print(', '.join(available_cube_names(cwcfg))) return # create the registry directory for this instance print('\n' + underline_title('Creating the instance %s' % appid)) create_dir(config.apphome) # cubicweb-ctl configuration if not self.config.automatic: print('\n' + underline_title('Configuring the instance (%s.conf)' % configname)) config.input_config('main', self.config.config_level) # configuration'specific stuff print() helper.bootstrap(cubes, self.config.automatic, self.config.config_level) # input for cubes specific options if not self.config.automatic: sections = set(sect.lower() for sect, opt, odict in config.all_options() if 'type' in odict and odict.get('level', 0) <= self.config.config_level) for section in sections: if section not in ('main', 'email', 'web'): print('\n' + underline_title('%s options' % section)) config.input_config(section, self.config.config_level) # write down configuration config.save() print('-> generated config %s' % config.main_config_file()) # handle i18n files structure # in the first cube given from cubicweb import i18n langs = [lang for lang, _ in i18n.available_catalogs(join(templdirs[0], 'i18n'))] errors = config.i18ncompile(langs) if errors: print('\n'.join(errors)) if self.config.automatic \ or not ASK.confirm('error while compiling message catalogs, ' 'continue anyway ?'): print('creation not completed') return # create the additional data directory for this instance if config.appdatahome != config.apphome: # true in dev mode create_dir(config.appdatahome) create_dir(join(config.appdatahome, 'backup')) if config['uid']: from logilab.common.shellutils import chown # this directory should be owned by the uid of the server process print('set %s as owner of the data directory' % config['uid']) chown(config.appdatahome, config['uid']) print('\n-> creation done for %s\n' % repr(config.apphome)[1:-1]) if not self.config.no_db_create: helper.postcreate(self.config.automatic, self.config.config_level)
def run(self, args): """run the command with its specific arguments""" if not args: mode = 'all' elif len(args) == 1: mode = args[0] else: raise BadCommandUsage('Too many arguments') from cubicweb.migration import ConfigurationProblem if mode == 'all': print('CubicWeb %s (%s mode)' % (cwcfg.cubicweb_version(), cwcfg.mode)) print() if mode in ('all', 'config', 'configurations'): cwcfg.load_available_configs() print('Available configurations:') for config in CONFIGURATIONS: print('*', config.name) for line in config.__doc__.splitlines(): line = line.strip() if not line: continue print(' ', line) print() if mode in ('all', 'cubes'): cfgpb = ConfigurationProblem(cwcfg) try: cube_names = available_cube_names(cwcfg) namesize = max(len(x) for x in cube_names) except ConfigurationError as ex: print('No cubes available:', ex) except ValueError: print('No cubes available') else: print('Available cubes:') for cube in cube_names: try: tinfo = cwcfg.cube_pkginfo(cube) tversion = tinfo.version cfgpb.add_cube(cube, tversion) except (ConfigurationError, AttributeError) as ex: tinfo = None tversion = '[missing cube information: %s]' % ex print('* %s %s' % (cube.ljust(namesize), tversion)) if self.config.verbose: if tinfo: descr = getattr(tinfo, 'description', '') if not descr: descr = tinfo.__doc__ if descr: print(' ' + ' \n'.join(descr.splitlines())) modes = detect_available_modes(cwcfg.cube_dir(cube)) print(' available modes: %s' % ', '.join(modes)) print() if mode in ('all', 'instances'): try: regdir = cwcfg.instances_dir() except ConfigurationError as ex: print('No instance available:', ex) print() return instances = list_instances(regdir) if instances: print('Available instances (%s):' % regdir) for appid in instances: modes = cwcfg.possible_configurations(appid) if not modes: print('* %s (BROKEN instance, no configuration found)' % appid) continue print('* %s (%s)' % (appid, ', '.join(modes))) try: config = cwcfg.config_for(appid, modes[0]) except Exception as exc: print(' (BROKEN instance, %s)' % exc) continue else: print('No instance available in %s' % regdir) print() if mode == 'all': # configuration management problem solving cfgpb.solve() if cfgpb.warnings: print('Warnings:\n', '\n'.join('* ' + txt for txt in cfgpb.warnings)) if cfgpb.errors: print('Errors:') for op, cube, version, src in cfgpb.errors: if op == 'add': print('* cube', cube, end=' ') if version: print(' version', version, end=' ') print('is not installed, but required by %s' % src) else: print( '* cube %s version %s is installed, but version %s is required by %s' % (cube, cfgpb.cubes[cube], version, src) )