def test(self): tmpdir = tempfile.mkdtemp(prefix='laymantmp_') makeconf = os.path.join(tmpdir, 'make.conf') reposconf = os.path.join(tmpdir, 'repos.conf') make_txt =\ 'PORTDIR_OVERLAY="\n'\ '$PORTDIR_OVERLAY"' # Create the .conf files so layman doesn't # complain. with fileopen(makeconf, 'w') as f: f.write(make_txt) with fileopen(reposconf, 'w') as f: f.write('') my_opts = { 'installed': HERE + '/testfiles/global-overlays.xml', 'make_conf': makeconf, 'nocheck': 'yes', 'storage': tmpdir, 'repos_conf': reposconf, 'conf_type': ['make.conf', 'repos.conf'], } config = OptionConfig(my_opts) config.set_option('quietness', 3) a = DB(config) config['output'].set_colorize(False) conf = RepoConfManager(config, a.overlays) # Set up our success tracker. success = [] # Add all the overlays in global_overlays.xml. for overlay in a.overlays.keys(): conf_success = conf.add(a.overlays[overlay]) if conf_success == False: success.append(False) else: success.append(True) # Disable one overlay. self.assertTrue(conf.disable(a.overlays['wrobel'])) # Enable disabled overlay. self.assertTrue(conf.enable(a.overlays['wrobel'])) # Delete all the overlays in global_overlays.xml. for overlay in a.overlays.keys(): self.assertTrue(conf.delete(a.overlays[overlay])) # Clean up. os.unlink(makeconf) os.unlink(reposconf) shutil.rmtree(tmpdir)
def test(self): repo_name = 'tar_test_overlay' temp_dir_path = tempfile.mkdtemp(prefix='laymantmp_') db_file = os.path.join(temp_dir_path, 'installed.xml') make_conf = os.path.join(temp_dir_path, 'make.conf') repo_conf = os.path.join(temp_dir_path, 'repos.conf') tar_source_path = os.path.join(HERE, 'testfiles', 'layman-test.tar.bz2') (_, temp_tarball_path) = tempfile.mkstemp() shutil.copyfile(tar_source_path, temp_tarball_path) # Write overlay collection XML xml_text = '''\ <?xml version="1.0" encoding="UTF-8"?> <repositories xmlns="" version="1.0"> <repo quality="experimental" status="unofficial"> <name>%(repo_name)s</name> <description>XXXXXXXXXXX</description> <owner> <email>[email protected]</email> </owner> <source type="tar">file://%(temp_tarball_url)s</source> </repo> </repositories> '''\ % { 'temp_tarball_url': urllib.pathname2url(temp_tarball_path), 'repo_name': repo_name } (fd, temp_xml_path) = tempfile.mkstemp() my_opts = { 'installed': temp_xml_path, 'conf_type': ['make.conf', 'repos.conf'], 'db_type': 'xml', 'nocheck': 'yes', 'make_conf': make_conf, 'repos_conf': repo_conf, 'storage': temp_dir_path, 'check_official': False } with os.fdopen(fd, 'w') as f: f.write(xml_text) with fileopen(make_conf, 'w') as f: f.write('PORTDIR_OVERLAY="$PORTDIR_OVERLAY"\n') with fileopen(repo_conf, 'w') as f: f.write('') config = OptionConfig(options=my_opts) config.set_option('quietness', 3) a = DB(config) config.set_option('installed', db_file) # Add an overlay to a fresh DB file. b = DB(config) b.add(a.select(repo_name)) # Make sure it's actually installed. specific_overlay_path = os.path.join(temp_dir_path, repo_name) self.assertTrue(os.path.exists(specific_overlay_path)) # Check the DbBase to ensure that it's reading the installed.xml. c = DbBase(config, paths=[ db_file, ]) self.assertEqual(list(c.overlays), ['tar_test_overlay']) # Make sure the configs have been written to correctly. conf = RepoConfManager(config, b.overlays) self.assertEqual(list(conf.overlays), ['tar_test_overlay']) # Delete the overlay from the second DB. b.delete(b.select(repo_name)) self.assertEqual(b.overlays, {}) # Ensure the installed.xml has been cleaned properly. c = DbBase(config, paths=[ db_file, ]) self.assertEqual(c.overlays, {}) conf = RepoConfManager(config, b.overlays) self.assertEqual(conf.overlays, {}) # Clean up. os.unlink(temp_xml_path) os.unlink(temp_tarball_path) shutil.rmtree(temp_dir_path)
class Main(object): def __init__(self, root=None, config=None, output=None): self.parser = None self.output = output self.config = config self.args = None self.root = root def args_parser(self): self.parser = argparse.ArgumentParser(prog='layman-updater', description="Layman's update script") self.parser.add_argument("-H", '--setup_help', action='store_true', help = 'Print the NEW INSTALL help messages.') self.parser.add_argument("-c", "--config", help='the path to config file') self.parser.add_argument('--version', action='version', version='%(prog)s ' + VERSION) self.args = self.parser.parse_args() def __call__(self): self.args_parser() options = None if self.args.config: options = { 'config': self.args.config, } self.config = OptionConfig(options=options, root=self.root) # fix the config path defaults = self.config.get_defaults() defaults['config'] = defaults['config'] \ % {'configdir': defaults['configdir']} self.config.update_defaults({'config': defaults['config']}) self.config.read_config(defaults) layman_inst = LaymanAPI(config=self.config) self.output = layman_inst.output if self.args.setup_help: self.print_instructions() elif not self.check_is_new(): self.rename_check() def check_is_new(self): print_instructions = False if isinstance(self.config['conf_type'], STR): self.config.set_option('conf_type', self.config['conf_type'].split(', ')) for i in self.config['conf_type']: conf = i.replace('.', '_') if not os.access(self.config[conf], os.F_OK): getattr(self, 'create_%(conf)s' % {'conf': conf})() print_instructions = True if print_instructions: self.print_instructions() return True return False def rename_check(self): '''Checks for and renames the installed db if needed ''' newname = self.config['installed'] # check and handle the name change if not os.access(newname, os.F_OK): if os.access(self.config['local_list'], os.F_OK): self.output.info(" Layman automatic db rename utility, " "performing update", 2) rename_db(self.config, newname, self.output) elif os.access(newname, os.F_OK) and \ os.access(self.config['local_list'], os.F_OK): self.output.error(" Automatic db rename failed: " "Both old and new files exist") self.output.error(" Old file: %s still exists" % self.config['local_list']) self.output.error(" New file: %s already exists" % newname) elif os.access(newname, os.F_OK): self.output.info(" Automatic db rename: " "db already updated: %s" % newname) else: self.output.info(" Automatic db rename: " "nothing to update") return def print_instructions(self): make_conf = '/etc/portage/make.conf' if not os.access(make_conf, os.F_OK): make_conf = '/etc/make.conf' messages = [ "You are now ready to add overlays into your system.", "", " layman -L", "", "will display a list of available overlays.", "", "Select an overlay and add it using", "", " layman -a overlay-name", "", "If this is the very first overlay you add with layman,", "you need to append the following statement to your", "%s file:" %make_conf, "", " source /var/lib/layman/make.conf", "", "If you modify the 'storage' parameter in the layman", "configuration file (/etc/layman/layman.cfg) you will", "need to adapt the path given above to the new storage", "directory.", "", ] for message in messages: self.output.info(" " + message) def create_make_conf(self): self.output.info(" Creating layman's make.conf file") # create layman's %(storage)s/make.conf # so portage won't error from layman.config_modules.makeconf.makeconf import ConfigHandler maker = ConfigHandler(self.config, None) maker.write() def create_repos_conf(self): self.output.info(" Creating layman's repos.conf file") layman_inst = LaymanAPI(config=self.config) overlays = {} for ovl in layman_inst.get_installed(): overlays[ovl] = layman_inst._get_installed_db().select(ovl) # create layman's %(repos_conf) so layman # can write the overlays to it. open(self.config['repos_conf'], 'w').close() from layman.config_modules.reposconf.reposconf import ConfigHandler repos_conf = ConfigHandler(self.config, overlays) repos_conf.write()
def test(self): tmpdir = tempfile.mkdtemp(prefix='laymantmp_') makeconf = os.path.join(tmpdir, 'make.conf') reposconf = os.path.join(tmpdir, 'repos.conf') make_txt =\ 'PORTDIR_OVERLAY="\n'\ '$PORTDIR_OVERLAY"' # Create the .conf files so layman doesn't # complain. with fileopen(makeconf, 'w') as f: f.write(make_txt) with fileopen(reposconf, 'w') as f: f.write('') my_opts = { 'installed' : HERE + '/testfiles/global-overlays.xml', 'make_conf' : makeconf, 'nocheck' : 'yes', 'storage' : tmpdir, 'repos_conf' : reposconf, 'conf_type' : ['make.conf', 'repos.conf'], } config = OptionConfig(my_opts) config.set_option('quietness', 3) a = DB(config) config['output'].set_colorize(False) conf = RepoConfManager(config, a.overlays) # Set up our success tracker. success = [] # Add all the overlays in global_overlays.xml. for overlay in a.overlays.keys(): conf_success = conf.add(a.overlays[overlay]) if False in conf_success: success.append(False) else: success.append(True) # Disable one overlay. conf_success = conf.disable(a.overlays['wrobel']) if False in conf_success: success.append(False) else: success.append(True) # Enable disabled overlay. conf_success = conf.enable(a.overlays['wrobel']) if False in conf_success: success.append(False) else: success.append(True) # Delete all the overlays in global_overlays.xml. for overlay in a.overlays.keys(): conf_success = conf.delete(a.overlays[overlay]) if False in conf_success: success.append(False) else: success.append(True) # Clean up. os.unlink(makeconf) os.unlink(reposconf) shutil.rmtree(tmpdir) if False in success: success = False else: success = True self.assertTrue(success)
class Main(object): def __init__(self, root=None, config=None, output=None): self.parser = None self.output = output self.config = config self.args = None self.root = root def args_parser(self): self.parser = argparse.ArgumentParser(prog='layman-updater', description="Layman's update script") self.parser.add_argument("-H", '--setup_help', action='store_true', help = 'Print the NEW INSTALL help messages.') self.parser.add_argument("-c", "--config", help='the path to config file') self.parser.add_argument("-m", "--migrate_db", help="the database you'd like to migrate to") self.parser.add_argument("-R", "--rebuild", action='store_true', help='rebuild the Package Manager config file') self.parser.add_argument('--version', action='version', version='%(prog)s ' + VERSION) self.args = self.parser.parse_args() def __call__(self): self.args_parser() options = None if self.args.config: options = { 'config': self.args.config, } self.config = OptionConfig(options=options, root=self.root) # fix the config path defaults = self.config.get_defaults() defaults['config'] = defaults['config'] \ % {'configdir': defaults['configdir']} self.config.update_defaults({'config': defaults['config']}) self.config.read_config(defaults) layman_inst = LaymanAPI(config=self.config) self.output = layman_inst.output if self.args.setup_help: self.print_instructions() elif not self.check_is_new(self.args.rebuild): self.rename_check() if self.args.migrate_db: self.migrate_database(self.args.migrate_db) def check_is_new(self, rebuild=False): print_instructions = False if isinstance(self.config['conf_type'], STR): self.config.set_option('conf_type', self.config['conf_type'].split(',')) for i in self.config['conf_type']: conf = i.replace('.', '_').strip() if conf and (rebuild or not os.access(self.config[conf], os.F_OK)): getattr(self, 'create_%(conf)s' % {'conf': conf})() print_instructions = True if print_instructions: self.print_instructions() return True return False def migrate_database(self, migrate_type): if migrate_type not in DB_TYPES: msg = 'migrate_database() error; invalid migration type: '\ '"%(db_type)s"' % {'db_type': migrate_type} self.output.die(msg) db = DB(self.config) installed = self.config['installed'] old_ext = os.path.splitext(installed)[1] backup_name = installed + '.' + self.config['db_type'] if old_ext == "." + self.config['db_type']: backup_name = installed + '.bak' new_name = installed.replace(old_ext, '.db') if not os.path.isfile(installed): msg = 'migrate_database() error; database file "%(loc)s" does not '\ 'exist!' % {'loc': backup_name} self.output.error(' ' + msg) raise Exception(msg) msg = ' Creating backup of "%(db)s" at:\n "%(loc)s"\n'\ % {'db': installed, 'loc': backup_name} self.output.info(msg) try: if migrate_type in ('json', 'xml'): shutil.copy(installed, backup_name) else: shutil.move(installed, backup_name) except IOError as err: msg = ' migrate_database() error; failed to back up old database '\ 'file.\n Error was: %(err)s' % {'err': err} self.output.error(msg) raise err db.write(installed, migrate_type=migrate_type) try: os.rename(installed, new_name) except OSError as err: msg = ' migrate_database() error: failed to rename old database '\ ' to "%(name)s".\n Error was: %(err)s' % {'err': err} self.output.error(msg) raise err msg = ' Successfully migrated database from "%(from_type)s" to '\ ' "%(to_type)s"\n' % {'from_type': self.config['db_type'], 'to_type': migrate_type} self.output.info(msg) self.set_db_type(migrate_type, os.path.basename(new_name)) msg = ' Warning: Please be sure to update your config file via '\ 'the\n `dispatch-conf` command or you *will* lose database '\ 'functionality!\n' self.output.warn(msg) def rename_check(self): '''Checks for and renames the installed db if needed ''' newname = self.config['installed'] # check and handle the name change if not os.access(newname, os.F_OK): if os.access(self.config['local_list'], os.F_OK): self.output.info(" Layman automatic db rename utility, " "performing update", 2) rename_db(self.config, newname, self.output) elif os.access(newname, os.F_OK) and \ os.access(self.config['local_list'], os.F_OK): self.output.error(" Automatic db rename failed: " "Both old and new files exist") self.output.error(" Old file: %s still exists" % self.config['local_list']) self.output.error(" New file: %s already exists" % newname) elif os.access(newname, os.F_OK): self.output.info(" Automatic db rename: " "db already updated: %s" % newname) else: self.output.info(" Automatic db rename: " "nothing to update") return def print_instructions(self): messages = [ "You are now ready to add overlays into your system.", "", " layman -L", "", "will display a list of available overlays.", "", "Select an overlay and add it using", "", " layman -a overlay-name", "",] if 'make.conf' in self.config['conf_type']: make_conf = '/etc/portage/make.conf' if not os.access(make_conf, os.F_OK): make_conf = '/etc/make.conf' messages += [ "If this is the very first overlay you add with layman,", "you need to append the following statement to your", "%s file:" % make_conf, "", " source /var/lib/layman/make.conf", "", "If you modify the 'storage' parameter in the layman", "configuration file (/etc/layman/layman.cfg) you will", "need to adapt the path given above to the new storage", "directory.", "",] for message in messages: self.output.info(" " + message) def create_make_conf(self): self.output.info(" Creating layman's make.conf file") layman_inst = LaymanAPI(config=self.config) overlays = {} for ovl in layman_inst.get_installed(): overlays[ovl] = layman_inst._get_installed_db().select(ovl) # create layman's %(storage)s/make.conf # so portage won't error from layman.config_modules.makeconf.makeconf import ConfigHandler maker = ConfigHandler(self.config, overlays) maker.write() def create_repos_conf(self): self.output.info(" Creating layman's repos.conf file") if os.path.isdir(self.config['repos_conf']): msg = ' create_repos_conf() error: %s is a directory and will\n'\ ' not be written to.' % self.config['repos_conf'] self.output.error(msg) return None conf_dir = os.path.dirname(self.config['repos_conf']) if not os.path.isdir(conf_dir): try: os.mkdir(conf_dir) except OSError as e: self.output.error(' create_repos_conf() error creating %s: '\ % conf_dir) self.output.error(' "%s"' % e) return None layman_inst = LaymanAPI(config=self.config) overlays = {} for ovl in layman_inst.get_installed(): overlays[ovl] = layman_inst._get_installed_db().select(ovl) # create layman's %(repos_conf) so layman # can write the overlays to it. open(self.config['repos_conf'], 'w').close() from layman.config_modules.reposconf.reposconf import ConfigHandler repos_conf = ConfigHandler(self.config, overlays) repos_conf.write() def set_db_type(self, migrate_type, installed): config_path = self.config['config']\ % {'configdir': self.config['configdir']} db_type_found = False installed_found = False new_conf = os.path.dirname(config_path) + '/' + '._cfg0000_' +\ os.path.basename(config_path) new_lines = [] try: shutil.copy(config_path, new_conf) except IOError as err: msg = ' set_db_type() error; failed to copy "%(old)s" to '\ '"%(new)s\n Error was: %(err)s"' % {'old': config_path, 'new': new_conf, 'err': err} self.output.error(msg) raise err if not os.path.isfile(new_conf): msg = 'set_db_type() error; failed to read config at "%(path)s".'\ % {'path': new_conf} self.output.error(' ' + msg) raise Exception(msg) try: with fileopen(new_conf, 'r') as laymanconf: lines = laymanconf.readlines() except Exception as err: msg = ' set_db_type() error; failed to read config at "%(path)s".'\ '\n Error was: "%(err)s"' % {'path': new_conf, 'err': err} self.output.error(msg) raise err for line in lines: if re.search('^#*\s*db_type\s*:', line): db_type_found = True line = 'db_type : ' + migrate_type + '\n' if re.search('^#*\s*installed\s*:', line): installed_found = True line = 'installed : %(storage)s/' + installed + '\n' new_lines.append(line) if not db_type_found: new_lines.append('db_type : ' + migrate_type + '\n') if not installed_found: new_lines.append('installed : %(storage)s/' + installed + '\n') with fileopen(new_conf, 'w') as laymanconf: for line in new_lines: laymanconf.write(line)
def test(self): repo_name = 'tar_test_overlay' temp_dir_path = tempfile.mkdtemp(prefix='laymantmp_') db_file = os.path.join(temp_dir_path, 'installed.xml') make_conf = os.path.join(temp_dir_path, 'make.conf') repo_conf = os.path.join(temp_dir_path, 'repos.conf') tar_source_path = os.path.join(HERE, 'testfiles', 'layman-test.tar.bz2') (_, temp_tarball_path) = tempfile.mkstemp() shutil.copyfile(tar_source_path, temp_tarball_path) # Write overlay collection XML xml_text = '''\ <?xml version="1.0" encoding="UTF-8"?> <repositories xmlns="" version="1.0"> <repo quality="experimental" status="unofficial"> <name>%(repo_name)s</name> <description>XXXXXXXXXXX</description> <owner> <email>[email protected]</email> </owner> <source type="tar">file://%(temp_tarball_url)s</source> </repo> </repositories> '''\ % { 'temp_tarball_url': urllib.pathname2url(temp_tarball_path), 'repo_name': repo_name } (fd, temp_xml_path) = tempfile.mkstemp() my_opts = {'installed' : temp_xml_path, 'conf_type' : ['make.conf', 'repos.conf'], 'db_type' : 'xml', 'nocheck' : 'yes', 'make_conf' : make_conf, 'repos_conf' : repo_conf, 'storage' : temp_dir_path, 'check_official': False} with os.fdopen(fd, 'w') as f: f.write(xml_text) with fileopen(make_conf, 'w') as f: f.write('PORTDIR_OVERLAY="$PORTDIR_OVERLAY"\n') with fileopen(repo_conf, 'w') as f: f.write('') config = OptionConfig(options=my_opts) config.set_option('quietness', 3) a = DB(config) config.set_option('installed', db_file) # Add an overlay to a fresh DB file. b = DB(config) b.add(a.select(repo_name)) # Make sure it's actually installed. specific_overlay_path = os.path.join(temp_dir_path, repo_name) self.assertTrue(os.path.exists(specific_overlay_path)) # Check the DbBase to ensure that it's reading the installed.xml. c = DbBase(config, paths=[db_file,]) self.assertEqual(list(c.overlays), ['tar_test_overlay']) # Make sure the configs have been written to correctly. conf = RepoConfManager(config, b.overlays) self.assertEqual(list(conf.overlays), ['tar_test_overlay']) # Delete the overlay from the second DB. b.delete(b.select(repo_name)) self.assertEqual(b.overlays, {}) # Ensure the installed.xml has been cleaned properly. c = DbBase(config, paths=[db_file,]) self.assertEqual(c.overlays, {}) conf = RepoConfManager(config, b.overlays) self.assertEqual(conf.overlays, {}) # Clean up. os.unlink(temp_xml_path) os.unlink(temp_tarball_path) shutil.rmtree(temp_dir_path)
class Main(object): def __init__(self, root=None, config=None, output=None): self.parser = None self.output = output self.config = config self.args = None self.root = root def args_parser(self): self.parser = argparse.ArgumentParser( prog='layman-updater', description="Layman's update script") self.parser.add_argument("-H", '--setup_help', action='store_true', help='Print the NEW INSTALL help messages.') self.parser.add_argument("-c", "--config", help='the path to config file') self.parser.add_argument("-m", "--migrate_db", help="the database you'd like to migrate to") self.parser.add_argument( "-R", "--rebuild", action='store_true', help='rebuild the Package Manager config file') self.parser.add_argument('--version', action='version', version='%(prog)s ' + VERSION) self.args = self.parser.parse_args() def __call__(self): self.args_parser() options = None if self.args.config: options = { 'config': self.args.config, } self.config = OptionConfig(options=options, root=self.root) # fix the config path defaults = self.config.get_defaults() defaults['config'] = defaults['config'] \ % {'configdir': defaults['configdir']} self.config.update_defaults({'config': defaults['config']}) self.config.read_config(defaults) layman_inst = LaymanAPI(config=self.config) self.output = layman_inst.output if self.args.setup_help: self.print_instructions() elif not self.check_is_new(self.args.rebuild): self.rename_check() if self.args.migrate_db: self.migrate_database(self.args.migrate_db) def check_is_new(self, rebuild=False): print_instructions = False if isinstance(self.config['conf_type'], STR): self.config.set_option('conf_type', self.config['conf_type'].split(',')) for i in self.config['conf_type']: conf = i.replace('.', '_').strip() if conf and (rebuild or not os.access(self.config[conf], os.F_OK)): getattr(self, 'create_%(conf)s' % {'conf': conf})() print_instructions = True if print_instructions: self.print_instructions() return True return False def migrate_database(self, migrate_type): if migrate_type not in DB_TYPES: msg = 'migrate_database() error; invalid migration type: '\ '"%(db_type)s"' % {'db_type': migrate_type} self.output.die(msg) db = DB(self.config) installed = self.config['installed'] old_ext = os.path.splitext(installed)[1] backup_name = installed + '.' + self.config['db_type'] if old_ext == "." + self.config['db_type']: backup_name = installed + '.bak' new_name = installed.replace(old_ext, '.db') if not os.path.isfile(installed): msg = 'migrate_database() error; database file "%(loc)s" does not '\ 'exist!' % {'loc': backup_name} self.output.error(' ' + msg) raise Exception(msg) msg = ' Creating backup of "%(db)s" at:\n "%(loc)s"\n'\ % {'db': installed, 'loc': backup_name} self.output.info(msg) try: if migrate_type in ('json', 'xml'): shutil.copy(installed, backup_name) else: shutil.move(installed, backup_name) except IOError as err: msg = ' migrate_database() error; failed to back up old database '\ 'file.\n Error was: %(err)s' % {'err': err} self.output.error(msg) raise err db.write(installed, migrate_type=migrate_type) try: os.rename(installed, new_name) except OSError as err: msg = ' migrate_database() error: failed to rename old database '\ ' to "%(name)s".\n Error was: %(err)s' % {'err': err} self.output.error(msg) raise err msg = ' Successfully migrated database from "%(from_type)s" to '\ ' "%(to_type)s"\n' % {'from_type': self.config['db_type'], 'to_type': migrate_type} self.output.info(msg) self.set_db_type(migrate_type, os.path.basename(new_name)) msg = ' Warning: Please be sure to update your config file via '\ 'the\n `dispatch-conf` command or you *will* lose database '\ 'functionality!\n' self.output.warn(msg) def rename_check(self): '''Checks for and renames the installed db if needed ''' newname = self.config['installed'] # check and handle the name change if not os.access(newname, os.F_OK): if os.access(self.config['local_list'], os.F_OK): self.output.info( " Layman automatic db rename utility, " "performing update", 2) rename_db(self.config, newname, self.output) elif os.access(newname, os.F_OK) and \ os.access(self.config['local_list'], os.F_OK): self.output.error(" Automatic db rename failed: " "Both old and new files exist") self.output.error(" Old file: %s still exists" % self.config['local_list']) self.output.error(" New file: %s already exists" % newname) elif os.access(newname, os.F_OK): self.output.info(" Automatic db rename: " "db already updated: %s" % newname) else: self.output.info(" Automatic db rename: " "nothing to update") return def print_instructions(self): messages = [ "You are now ready to add overlays into your system.", "", " layman -L", "", "will display a list of available overlays.", "", "Select an overlay and add it using", "", " layman -a overlay-name", "", ] if 'make.conf' in self.config['conf_type']: make_conf = '/etc/portage/make.conf' if not os.access(make_conf, os.F_OK): make_conf = '/etc/make.conf' messages += [ "If this is the very first overlay you add with layman,", "you need to append the following statement to your", "%s file:" % make_conf, "", " source /var/lib/layman/make.conf", "", "If you modify the 'storage' parameter in the layman", "configuration file (/etc/layman/layman.cfg) you will", "need to adapt the path given above to the new storage", "directory.", "", ] for message in messages: self.output.info(" " + message) def create_make_conf(self): self.output.info(" Creating layman's make.conf file") layman_inst = LaymanAPI(config=self.config) overlays = {} for ovl in layman_inst.get_installed(): overlays[ovl] = layman_inst._get_installed_db().select(ovl) # create layman's %(storage)s/make.conf # so portage won't error from layman.config_modules.makeconf.makeconf import ConfigHandler maker = ConfigHandler(self.config, overlays) maker.write() def create_repos_conf(self): self.output.info(" Creating layman's repos.conf file") if os.path.isdir(self.config['repos_conf']): msg = ' create_repos_conf() error: %s is a directory and will\n'\ ' not be written to.' % self.config['repos_conf'] self.output.error(msg) return None conf_dir = os.path.dirname(self.config['repos_conf']) if not os.path.isdir(conf_dir): try: os.mkdir(conf_dir) except OSError as e: self.output.error(' create_repos_conf() error creating %s: '\ % conf_dir) self.output.error(' "%s"' % e) return None layman_inst = LaymanAPI(config=self.config) overlays = {} for ovl in layman_inst.get_installed(): overlays[ovl] = layman_inst._get_installed_db().select(ovl) # create layman's %(repos_conf) so layman # can write the overlays to it. open(self.config['repos_conf'], 'w').close() from layman.config_modules.reposconf.reposconf import ConfigHandler repos_conf = ConfigHandler(self.config, overlays, rebuild=True) repos_conf.write() def set_db_type(self, migrate_type, installed): config_path = self.config['config']\ % {'configdir': self.config['configdir']} db_type_found = False installed_found = False new_conf = os.path.dirname(config_path) + '/' + '._cfg0000_' +\ os.path.basename(config_path) new_lines = [] try: shutil.copy(config_path, new_conf) except IOError as err: msg = ' set_db_type() error; failed to copy "%(old)s" to '\ '"%(new)s\n Error was: %(err)s"' % {'old': config_path, 'new': new_conf, 'err': err} self.output.error(msg) raise err if not os.path.isfile(new_conf): msg = 'set_db_type() error; failed to read config at "%(path)s".'\ % {'path': new_conf} self.output.error(' ' + msg) raise Exception(msg) try: with fileopen(new_conf, 'r') as laymanconf: lines = laymanconf.readlines() except Exception as err: msg = ' set_db_type() error; failed to read config at "%(path)s".'\ '\n Error was: "%(err)s"' % {'path': new_conf, 'err': err} self.output.error(msg) raise err for line in lines: if re.search('^#*\s*db_type\s*:', line): db_type_found = True line = 'db_type : ' + migrate_type + '\n' if re.search('^#*\s*installed\s*:', line): installed_found = True line = 'installed : %(storage)s/' + installed + '\n' new_lines.append(line) if not db_type_found: new_lines.append('db_type : ' + migrate_type + '\n') if not installed_found: new_lines.append('installed : %(storage)s/' + installed + '\n') with fileopen(new_conf, 'w') as laymanconf: for line in new_lines: laymanconf.write(line)