def _readconfig(): """Configure environment""" # Check that all dirs and files are present for dirname in ['nodes', 'roles', 'cookbooks', 'auth.cfg']: if not os.path.exists(dirname): msg = "You are executing 'cook' outside of a kitchen\n" msg += "To create a new kitchen in the current directory" msg += " type 'cook new_kitchen'" abort(msg) config = ConfigParser.ConfigParser() config.read("auth.cfg") # We expect an ssh_config file here, # and/or a user, (password/keyfile) pair try: ssh_config = config.get('userinfo', 'ssh-config') except ConfigParser.NoSectionError: msg = 'You need to define a "userinfo" section' msg += ' in auth.cfg. Refer to the README for help' msg += ' (http://github.com/tobami/littlechef)' abort(msg) except ConfigParser.NoOptionError: ssh_config = None if ssh_config: env.ssh_config = _SSHConfig() try: env.ssh_config.parse(open(os.path.expanduser(ssh_config))) except IOError: msg = "Couldn't open the ssh-config file '{0}'".format(ssh_config) abort(msg) except Exception: msg = "Couldn't parse the ssh-config file '{0}'".format(ssh_config) abort(msg) else: env.ssh_config = None try: env.user = config.get('userinfo', 'user') user_specified = True except ConfigParser.NoOptionError: if not ssh_config: msg = 'You need to define a user in the "userinfo" section' msg += ' of auth.cfg. Refer to the README for help' msg += ' (http://github.com/tobami/littlechef)' abort(msg) user_specified = False try: env.password = config.get('userinfo', 'password') or None except ConfigParser.NoOptionError: pass try: #If keypair-file is empty, assign None or fabric will try to read key " env.key_filename = config.get('userinfo', 'keypair-file') or None except ConfigParser.NoOptionError: pass if user_specified and (not env.password and not env.key_filename): abort('You need to define a password or a keypair-file in auth.cfg.')
def _annotate_hosts_with_ssh_config_info(): def hostinfo(host, config): hive = config.lookup(host) if 'hostname' in hive: host = hive['hostname'] if 'user' in hive: host = '%s@%s' % (hive['user'], host) if 'port' in hive: host = '%s:%s' % (host, hive['port']) return host try: config_file = file(_expanduser('~/.ssh/config')) except IOError: pass else: config = _SSHConfig() config.parse(config_file) keys = [config.lookup(host).get('identityfile', None) for host in env.hosts] env.key_filename = [_expanduser(key) for key in keys if key is not None] env.hosts = [hostinfo(host, config) for host in env.hosts]
def _readconfig(): """Configure environment""" # Check that all dirs and files are present in_a_kitchen, missing = _check_appliances() missing_str = lambda m: ' and '.join(', '.join(m).rsplit(', ', 1)) if not in_a_kitchen: msg = "Couldn't find {0}. ".format(missing_str(missing)) msg += "Are you are executing 'fix' outside of a kitchen?\n"\ "To create a new kitchen in the current directory "\ " type 'fix new_kitchen'" abort(msg) config = ConfigParser.ConfigParser() config.read("auth.cfg") # We expect an ssh_config file here, # and/or a user, (password/keyfile) pair env.ssh_config = None try: ssh_config = config.get('userinfo', 'ssh-config') except ConfigParser.NoSectionError: msg = 'You need to define a "userinfo" section' msg += ' in auth.cfg. Refer to the README for help' msg += ' (http://github.com/tobami/littlechef)' abort(msg) except ConfigParser.NoOptionError: ssh_config = None if ssh_config: env.ssh_config = _SSHConfig() try: env.ssh_config.parse(open(os.path.expanduser(ssh_config))) except IOError: msg = "Couldn't open the ssh-config file '{0}'".format(ssh_config) abort(msg) except Exception: msg = "Couldn't parse the ssh-config file '{0}'".format(ssh_config) abort(msg) try: env.user = config.get('userinfo', 'user') user_specified = True except ConfigParser.NoOptionError: if not ssh_config: msg = 'You need to define a user in the "userinfo" section' msg += ' of auth.cfg. Refer to the README for help' msg += ' (http://github.com/tobami/littlechef)' abort(msg) user_specified = False try: env.password = config.get('userinfo', 'password') or None except ConfigParser.NoOptionError: pass try: #If keypair-file is empty, assign None or fabric will try to read key " env.key_filename = config.get('userinfo', 'keypair-file') or None except ConfigParser.NoOptionError: pass if user_specified and not env.password and not env.ssh_config: abort('You need to define a password or a ssh-config file in auth.cfg.')
def _readconfig(): """Configure environment""" # Check that all dirs and files are present in_a_kitchen, missing = _check_appliances() missing_str = lambda m: ' and '.join(', '.join(m).rsplit(', ', 1)) if not in_a_kitchen: msg = "Couldn't find {0}. ".format(missing_str(missing)) msg += "Are you are executing 'cook' outside of a kitchen?\n"\ "To create a new kitchen in the current directory "\ " type 'cook new_kitchen'" abort(msg) config = ConfigParser.ConfigParser() config.read("auth.cfg") # We expect an ssh_config file here, # and/or a user, (password/keyfile) pair env.ssh_config = None try: ssh_config = config.get('userinfo', 'ssh-config') except ConfigParser.NoSectionError: msg = 'You need to define a "userinfo" section' msg += ' in auth.cfg. Refer to the README for help' msg += ' (http://github.com/tobami/littlechef)' abort(msg) except ConfigParser.NoOptionError: ssh_config = None if ssh_config: env.ssh_config = _SSHConfig() try: env.ssh_config.parse(open(os.path.expanduser(ssh_config))) except IOError: msg = "Couldn't open the ssh-config file '{0}'".format(ssh_config) abort(msg) except Exception: msg = "Couldn't parse the ssh-config file '{0}'".format(ssh_config) abort(msg) try: env.user = config.get('userinfo', 'user') user_specified = True except ConfigParser.NoOptionError: if not ssh_config: msg = 'You need to define a user in the "userinfo" section' msg += ' of auth.cfg. Refer to the README for help' msg += ' (http://github.com/tobami/littlechef)' abort(msg) user_specified = False try: env.password = config.get('userinfo', 'password') or None except ConfigParser.NoOptionError: pass try: #If keypair-file is empty, assign None or fabric will try to read key " env.key_filename = config.get('userinfo', 'keypair-file') or None except ConfigParser.NoOptionError: pass if user_specified and (not env.password and not env.key_filename): abort('You need to define a password or a keypair-file in auth.cfg.')
def _readconfig(): """Configures environment variables""" config = ConfigParser.SafeConfigParser() try: found = config.read(littlechef.CONFIGFILE) except ConfigParser.ParsingError as e: abort(str(e)) if not len(found): try: found = config.read(['config.cfg', 'auth.cfg']) except ConfigParser.ParsingError as e: abort(str(e)) if len(found): print('\nDeprecationWarning: deprecated config file name \'{0}\'.' ' Use {1}'.format(found[0], littlechef.CONFIGFILE)) else: abort('No {0} file found in the current ' 'directory'.format(littlechef.CONFIGFILE)) in_a_kitchen, missing = _check_appliances() missing_str = lambda m: ' and '.join(', '.join(m).rsplit(', ', 1)) if not in_a_kitchen: abort("Couldn't find {0}. " "Are you executing 'fix' outside of a kitchen?\n" "To create a new kitchen in the current directory " " type 'fix new_kitchen'".format(missing_str(missing))) # We expect an ssh_config file here, # and/or a user, (password/keyfile) pair try: env.ssh_config_path = config.get('userinfo', 'ssh-config') except ConfigParser.NoSectionError: abort('You need to define a "userinfo" section' ' in the config file. Refer to the README for help ' '(http://github.com/tobami/littlechef)') except ConfigParser.NoOptionError: env.ssh_config_path = None if env.ssh_config_path: env.ssh_config = _SSHConfig() env.ssh_config_path = os.path.expanduser(env.ssh_config_path) env.use_ssh_config = True try: env.ssh_config.parse(open(env.ssh_config_path)) except IOError: abort("Couldn't open the ssh-config file " "'{0}'".format(env.ssh_config_path)) except Exception: abort("Couldn't parse the ssh-config file " "'{0}'".format(env.ssh_config_path)) else: env.ssh_config = None # check for a gateway try: env.gateway = config.get('connection', 'gateway') except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): env.gateway = None # Check for an encrypted_data_bag_secret file and set the env option try: env.encrypted_data_bag_secret = config.get('userinfo', 'encrypted_data_bag_secret') except ConfigParser.NoOptionError: env.encrypted_data_bag_secret = None if env.encrypted_data_bag_secret: env.encrypted_data_bag_secret = os.path.expanduser( env.encrypted_data_bag_secret) try: open(env.encrypted_data_bag_secret) except IOError as e: abort("Failed to open encrypted_data_bag_secret file at " "'{0}'".format(env.encrypted_data_bag_secret)) try: sudo_prefix = config.get('ssh', 'sudo_prefix', raw=True) except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): pass else: env.sudo_prefix = sudo_prefix try: env.user = config.get('userinfo', 'user') except ConfigParser.NoOptionError: if not env.ssh_config_path: msg = 'You need to define a user in the "userinfo" section' msg += ' of config.cfg. Refer to the README for help' msg += ' (http://github.com/tobami/littlechef)' abort(msg) user_specified = False else: user_specified = True try: env.password = config.get('userinfo', 'password') or None except ConfigParser.NoOptionError: pass try: #If keypair-file is empty, assign None or fabric will try to read key " env.key_filename = config.get('userinfo', 'keypair-file') or None except ConfigParser.NoOptionError: pass if user_specified and not env.password and not env.key_filename and not env.ssh_config: abort('You need to define a password, keypair file, or ssh-config file in config.cfg') # Node's Chef Solo working directory for storing cookbooks, roles, etc. try: env.node_work_path = os.path.expanduser(config.get('kitchen', 'node_work_path')) except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): env.node_work_path = littlechef.node_work_path else: if not env.node_work_path: abort('The "node_work_path" option cannot be empty') # Follow symlinks try: env.follow_symlinks = config.getboolean('kitchen', 'follow_symlinks') except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): env.follow_symlinks = False
def _readconfig(): """Configures environment variables""" config = ConfigParser.SafeConfigParser() try: found = config.read([littlechef.CONFIGFILE, 'auth.cfg']) except ConfigParser.ParsingError as e: abort(str(e)) if not len(found): abort('No config.cfg file found in the current directory') in_a_kitchen, missing = _check_appliances() missing_str = lambda m: ' and '.join(', '.join(m).rsplit(', ', 1)) if not in_a_kitchen: abort("Couldn't find {0}. " "Are you executing 'fix' outside of a kitchen?\n" "To create a new kitchen in the current directory " " type 'fix new_kitchen'".format(missing_str(missing))) # We expect an ssh_config file here, # and/or a user, (password/keyfile) pair try: env.ssh_config_path = config.get('userinfo', 'ssh-config') except ConfigParser.NoSectionError: abort('You need to define a "userinfo" section' ' in config.cfg. Refer to the README for help' ' (http://github.com/tobami/littlechef)') except ConfigParser.NoOptionError: env.ssh_config_path = None if env.ssh_config_path: env.ssh_config = _SSHConfig() env.ssh_config_path = os.path.expanduser(env.ssh_config_path) env.use_ssh_config = True try: env.ssh_config.parse(open(env.ssh_config_path)) except IOError: abort("Couldn't open the ssh-config file " "'{0}'".format(env.ssh_config_path)) except Exception: abort("Couldn't parse the ssh-config file " "'{0}'".format(env.ssh_config_path)) else: env.ssh_config = None # Check for an encrypted_data_bag_secret file and set the env option try: env.encrypted_data_bag_secret = config.get( 'userinfo', 'encrypted_data_bag_secret') except ConfigParser.NoOptionError: env.encrypted_data_bag_secret = None if env.encrypted_data_bag_secret: env.encrypted_data_bag_secret = os.path.expanduser( env.encrypted_data_bag_secret) try: open(env.encrypted_data_bag_secret) except IOError as e: abort("Failed to open encrypted_data_bag_secret file at " "'{0}'".format(env.encrypted_data_bag_secret)) try: sudo_prefix = config.get('ssh', 'sudo_prefix', raw=True) except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): pass else: env.sudo_prefix = sudo_prefix try: env.user = config.get('userinfo', 'user') except ConfigParser.NoOptionError: if not env.ssh_config_path: msg = 'You need to define a user in the "userinfo" section' msg += ' of config.cfg. Refer to the README for help' msg += ' (http://github.com/tobami/littlechef)' abort(msg) user_specified = False else: user_specified = True try: env.password = config.get('userinfo', 'password') or None except ConfigParser.NoOptionError: pass try: #If keypair-file is empty, assign None or fabric will try to read key " env.key_filename = config.get('userinfo', 'keypair-file') or None except ConfigParser.NoOptionError: pass if user_specified and not env.password and not env.key_filename and not env.ssh_config: abort( 'You need to define a password, keypair file, or ssh-config file in config.cfg' ) # Node's Chef Solo working directory for storing cookbooks, roles, etc. try: env.node_work_path = os.path.expanduser( config.get('kitchen', 'node_work_path')) except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): env.node_work_path = littlechef.node_work_path else: if not env.node_work_path: abort('The "node_work_path" option cannot be empty') # Follow symlinks try: env.follow_symlinks = config.getboolean('kitchen', 'follow_symlinks') except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): env.follow_symlinks = False
def _readconfig(): """Configures environment variables""" config = ConfigParser.SafeConfigParser() try: found = config.read(littlechef.CONFIGFILE) except ConfigParser.ParsingError as e: abort(str(e)) if not len(found): try: found = config.read(['config.cfg', 'auth.cfg']) except ConfigParser.ParsingError as e: abort(str(e)) if len(found): print( '\nDeprecationWarning: deprecated config file name \'{0}\'.' ' Use {1}'.format(found[0], littlechef.CONFIGFILE)) else: abort('No {0} file found in the current ' 'directory'.format(littlechef.CONFIGFILE)) in_a_kitchen, missing = _check_appliances() missing_str = lambda m: ' and '.join(', '.join(m).rsplit(', ', 1)) if not in_a_kitchen: abort("Couldn't find {0}. " "Are you executing 'fix' outside of a kitchen?\n" "To create a new kitchen in the current directory " " type 'fix new_kitchen'".format(missing_str(missing))) # We expect an ssh_config file here, # and/or a user, (password/keyfile) pair try: env.ssh_config_path = config.get('userinfo', 'ssh-config') except ConfigParser.NoSectionError: abort('You need to define a "userinfo" section' ' in the config file. Refer to the README for help ' '(http://github.com/tobami/littlechef)') except ConfigParser.NoOptionError: env.ssh_config_path = None if env.ssh_config_path: env.ssh_config = _SSHConfig() env.ssh_config_path = os.path.expanduser(env.ssh_config_path) env.use_ssh_config = True try: env.ssh_config.parse(open(env.ssh_config_path)) except IOError: abort("Couldn't open the ssh-config file " "'{0}'".format(env.ssh_config_path)) except Exception: abort("Couldn't parse the ssh-config file " "'{0}'".format(env.ssh_config_path)) else: env.ssh_config = None # check for a gateway try: env.gateway = config.get('connection', 'gateway') except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): env.gateway = None # check for http_proxy which will be put into solo.rb try: env.http_proxy = config.get('connection', 'http_proxy') except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): env.http_proxy = None try: env.https_proxy = config.get('connection', 'https_proxy') except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): env.https_proxy = None # check for no_proxy try: env.no_proxy = config.get('connection', 'no_proxy') except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): env.no_proxy = None # Check for an encrypted_data_bag_secret file and set the env option try: env.encrypted_data_bag_secret = config.get( 'userinfo', 'encrypted_data_bag_secret') except ConfigParser.NoOptionError: env.encrypted_data_bag_secret = None if env.encrypted_data_bag_secret: env.encrypted_data_bag_secret = os.path.expanduser( env.encrypted_data_bag_secret) try: open(env.encrypted_data_bag_secret) except IOError as e: abort("Failed to open encrypted_data_bag_secret file at " "'{0}'".format(env.encrypted_data_bag_secret)) try: sudo_prefix = config.get('ssh', 'sudo_prefix', raw=True) except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): pass else: env.sudo_prefix = sudo_prefix try: env.user = config.get('userinfo', 'user') except ConfigParser.NoOptionError: if not env.ssh_config_path: msg = 'You need to define a user in the "userinfo" section' msg += ' of {0}. Refer to the README for help' msg += ' (http://github.com/tobami/littlechef)' abort(msg.format(littlechef.CONFIGFILE)) user_specified = False else: user_specified = True try: env.password = config.get('userinfo', 'password') or None except ConfigParser.NoOptionError: pass try: # If keypair-file is empty, assign None or fabric will try to read key env.key_filename = config.get('userinfo', 'keypair-file') or None except ConfigParser.NoOptionError: pass if (user_specified and not env.password and not env.key_filename and not env.ssh_config): abort('You need to define a password, keypair file, or ssh-config ' 'file in {0}'.format(littlechef.CONFIGFILE)) # Node's Chef Solo working directory for storing cookbooks, roles, etc. try: env.node_work_path = os.path.expanduser( config.get('kitchen', 'node_work_path')) except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): env.node_work_path = littlechef.node_work_path else: if not env.node_work_path: abort('The "node_work_path" option cannot be empty') # Follow symlinks try: env.follow_symlinks = config.getboolean('kitchen', 'follow_symlinks') except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): env.follow_symlinks = False try: env.berksfile = config.get('kitchen', 'berksfile') except (ConfigParser.NoSectionError, ConfigParser.NoOptionError) as e: env.berksfile = None else: try: env.berksfile_cookbooks_directory = config.get( 'kitchen', 'berksfile_cookbooks_directory') littlechef.cookbook_paths.append(env.berksfile_cookbooks_directory) except (ConfigParser.NoSectionError, ConfigParser.NoOptionError) as e: if env.berksfile: env.berksfile_cookbooks_directory = tempfile.mkdtemp( 'littlechef-berks') littlechef.cookbook_paths.append( env.berksfile_cookbooks_directory) else: env.berksfile_cookbooks_directory = None chef.ensure_berksfile_cookbooks_are_installed() # Upload Directory try: env.sync_packages_dest_dir = config.get('sync-packages', 'dest-dir') except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): env.sync_packages_dest_dir = None # Local Directory try: env.sync_packages_local_dir = config.get('sync-packages', 'local-dir') except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): env.sync_packages_local_dir = None try: env.autodeploy_chef = config.get('userinfo', 'autodeploy_chef') or None except ConfigParser.NoOptionError: env.autodeploy_chef = None