Massive pylint + pep8 fixups!
This commit is contained in:
parent
8ed740ce0f
commit
ea70a98476
@ -75,6 +75,7 @@ def welcome(action):
|
||||
sys.stderr.flush()
|
||||
LOG.info(welcome_msg)
|
||||
|
||||
|
||||
def extract_fns(args):
|
||||
# Files are already opened so lets just pass that along
|
||||
# since it would of broke if it couldn't have
|
||||
@ -329,11 +330,11 @@ def main_single(name, args):
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
|
||||
# Top level args
|
||||
parser.add_argument('--version', '-v', action='version',
|
||||
parser.add_argument('--version', '-v', action='version',
|
||||
version='%(prog)s ' + (version.version_string()))
|
||||
parser.add_argument('--file', '-f', action='append',
|
||||
parser.add_argument('--file', '-f', action='append',
|
||||
dest='files',
|
||||
help=('additional yaml configuration'
|
||||
' files to use'),
|
||||
@ -345,18 +346,18 @@ def main():
|
||||
subparsers = parser.add_subparsers()
|
||||
|
||||
# Each action and its sub-options (if any)
|
||||
parser_init = subparsers.add_parser('init',
|
||||
parser_init = subparsers.add_parser('init',
|
||||
help=('initializes cloud-init and'
|
||||
' performs initial modules'))
|
||||
parser_init.add_argument("--local", '-l', action='store_true',
|
||||
help="start in local mode (default: %(default)s)",
|
||||
default=False)
|
||||
# This is used so that we can know which action is selected +
|
||||
# This is used so that we can know which action is selected +
|
||||
# the functor to use to run this subcommand
|
||||
parser_init.set_defaults(action=('init', main_init))
|
||||
|
||||
# These settings are used for the 'config' and 'final' stages
|
||||
parser_mod = subparsers.add_parser('modules',
|
||||
parser_mod = subparsers.add_parser('modules',
|
||||
help=('activates modules '
|
||||
'using a given configuration key'))
|
||||
parser_mod.add_argument("--mode", '-m', action='store',
|
||||
@ -368,7 +369,7 @@ def main():
|
||||
|
||||
# These settings are used when you want to query information
|
||||
# stored in the cloud-init data objects/directories/files
|
||||
parser_query = subparsers.add_parser('query',
|
||||
parser_query = subparsers.add_parser('query',
|
||||
help=('query information stored '
|
||||
'in cloud-init'))
|
||||
parser_query.add_argument("--name", '-n', action="store",
|
||||
@ -378,7 +379,7 @@ def main():
|
||||
parser_query.set_defaults(action=('query', main_query))
|
||||
|
||||
# This subcommand allows you to run a single module
|
||||
parser_single = subparsers.add_parser('single',
|
||||
parser_single = subparsers.add_parser('single',
|
||||
help=('run a single module '))
|
||||
parser_single.set_defaults(action=('single', main_single))
|
||||
parser_single.add_argument("--name", '-n', action="store",
|
||||
@ -394,10 +395,10 @@ def main():
|
||||
' pass to this module'))
|
||||
parser_single.set_defaults(action=('single', main_single))
|
||||
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Setup basic logging to start (until reinitialized)
|
||||
# iff in debug mode...
|
||||
if args.debug:
|
||||
logging.setupBasicLogging()
|
||||
|
||||
@ -407,4 +408,3 @@ def main():
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
|
||||
|
@ -38,6 +38,7 @@ LOG = logging.getLogger(__name__)
|
||||
# as providing a backwards compatible object that can be maintained
|
||||
# while the stages/other objects can be worked on independently...
|
||||
|
||||
|
||||
class Cloud(object):
|
||||
def __init__(self, datasource, paths, cfg, distro, runners):
|
||||
self.datasource = datasource
|
||||
@ -71,7 +72,7 @@ class Cloud(object):
|
||||
# The rest of thes are just useful proxies
|
||||
def get_userdata(self):
|
||||
return self.datasource.get_userdata()
|
||||
|
||||
|
||||
def get_instance_id(self):
|
||||
return self.datasource.get_instance_id()
|
||||
|
||||
|
@ -25,7 +25,7 @@ from cloudinit import log as logging
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
# This prefix is used to make it less
|
||||
# This prefix is used to make it less
|
||||
# of a change that when importing
|
||||
# we will not find something else with the same
|
||||
# name in the lookup path...
|
||||
|
@ -24,7 +24,7 @@ import os
|
||||
from cloudinit import templater
|
||||
from cloudinit import util
|
||||
|
||||
ruby_version_default = "1.8"
|
||||
RUBY_VERSION_DEFAULT = "1.8"
|
||||
|
||||
|
||||
def handle(name, cfg, cloud, log, _args):
|
||||
@ -38,11 +38,11 @@ def handle(name, cfg, cloud, log, _args):
|
||||
|
||||
# Ensure the chef directories we use exist
|
||||
c_dirs = [
|
||||
'/etc/chef',
|
||||
'/var/log/chef',
|
||||
'/var/lib/chef',
|
||||
'/var/cache/chef',
|
||||
'/var/backups/chef',
|
||||
'/etc/chef',
|
||||
'/var/log/chef',
|
||||
'/var/lib/chef',
|
||||
'/var/cache/chef',
|
||||
'/var/backups/chef',
|
||||
'/var/run/chef',
|
||||
]
|
||||
for d in c_dirs:
|
||||
@ -92,7 +92,7 @@ def handle(name, cfg, cloud, log, _args):
|
||||
# this will install and run the chef-client from gems
|
||||
chef_version = util.get_cfg_option_str(chef_cfg, 'version', None)
|
||||
ruby_version = util.get_cfg_option_str(chef_cfg, 'ruby_version',
|
||||
ruby_version_default)
|
||||
RUBY_VERSION_DEFAULT)
|
||||
install_chef_from_gems(cloud.distro, ruby_version, chef_version)
|
||||
# and finally, run chef-client
|
||||
log.debug('Running chef-client')
|
||||
|
@ -24,13 +24,13 @@ from cloudinit.settings import PER_ALWAYS
|
||||
|
||||
frequency = PER_ALWAYS
|
||||
|
||||
reject_cmd = ['route', 'add', '-host', '169.254.169.254', 'reject']
|
||||
REJECT_CMD = ['route', 'add', '-host', '169.254.169.254', 'reject']
|
||||
|
||||
|
||||
def handle(name, cfg, _cloud, log, _args):
|
||||
disabled = util.get_cfg_option_bool(cfg, "disable_ec2_metadata", False)
|
||||
if disabled:
|
||||
util.subp(reject_cmd)
|
||||
util.subp(REJECT_CMD)
|
||||
else:
|
||||
log.debug(("Skipping transform named %s,"
|
||||
" disabling the ec2 route not enabled"), name)
|
||||
|
@ -28,7 +28,7 @@ from cloudinit.settings import PER_ALWAYS
|
||||
|
||||
frequency = PER_ALWAYS
|
||||
|
||||
final_message_def = ("Cloud-init v. {{version}} finished at {{timestamp}}."
|
||||
FINAL_MESSAGE_DEF = ("Cloud-init v. {{version}} finished at {{timestamp}}."
|
||||
" Up {{uptime}} seconds.")
|
||||
|
||||
|
||||
@ -39,21 +39,21 @@ def handle(_name, cfg, cloud, log, args):
|
||||
msg_in = args[0]
|
||||
else:
|
||||
msg_in = util.get_cfg_option_str(cfg, "final_message")
|
||||
|
||||
|
||||
if not msg_in:
|
||||
template_fn = cloud.get_template_filename('final_message')
|
||||
if template_fn:
|
||||
msg_in = util.load_file(template_fn)
|
||||
|
||||
if not msg_in:
|
||||
msg_in = final_message_def
|
||||
msg_in = FINAL_MESSAGE_DEF
|
||||
|
||||
uptime = util.uptime()
|
||||
ts = util.time_rfc2822()
|
||||
cver = version.version_string()
|
||||
try:
|
||||
subs = {
|
||||
'uptime': uptime,
|
||||
'uptime': uptime,
|
||||
'timestamp': ts,
|
||||
'version': cver,
|
||||
}
|
||||
|
@ -30,19 +30,19 @@ from cloudinit.settings import PER_INSTANCE
|
||||
# as well as any datasource provided configuration
|
||||
# c) A cloud object that can be used to access various
|
||||
# datasource and paths for the given distro and data provided
|
||||
# by the various datasource instance types.
|
||||
# by the various datasource instance types.
|
||||
# d) A argument list that may or may not be empty to this module.
|
||||
# Typically those are from module configuration where the module
|
||||
# is defined with some extra configuration that will eventually
|
||||
# be translated from yaml into arguments to this module.
|
||||
# 2. A optional 'frequency' that defines how often this module should be ran.
|
||||
# Typically one of PER_INSTANCE, PER_ALWAYS, PER_ONCE. If not
|
||||
# provided PER_INSTANCE will be assumed.
|
||||
# Typically one of PER_INSTANCE, PER_ALWAYS, PER_ONCE. If not
|
||||
# provided PER_INSTANCE will be assumed.
|
||||
# See settings.py for these constants.
|
||||
# 3. A optional 'distros' array/set/tuple that defines the known distros
|
||||
# this module will work with (if not all of them). This is used to write
|
||||
# a warning out if a module is being ran on a untested distribution for
|
||||
# informational purposes. If non existent all distros are assumed and
|
||||
# informational purposes. If non existent all distros are assumed and
|
||||
# no warning occurs.
|
||||
|
||||
frequency = PER_INSTANCE
|
||||
|
@ -26,13 +26,13 @@ from cloudinit import util
|
||||
frequency = PER_INSTANCE
|
||||
|
||||
# This is a tool that cloud init provides
|
||||
helper_tool = '/usr/lib/cloud-init/write-ssh-key-fingerprints'
|
||||
HELPER_TOOL = '/usr/lib/cloud-init/write-ssh-key-fingerprints'
|
||||
|
||||
|
||||
def handle(name, cfg, cloud, log, _args):
|
||||
if not os.path.exists(helper_tool):
|
||||
if not os.path.exists(HELPER_TOOL):
|
||||
log.warn(("Unable to activate transform %s,"
|
||||
" helper tool not found at %s"), name, helper_tool)
|
||||
" helper tool not found at %s"), name, HELPER_TOOL)
|
||||
return
|
||||
|
||||
fp_blacklist = util.get_cfg_option_list(cfg,
|
||||
@ -42,7 +42,7 @@ def handle(name, cfg, cloud, log, _args):
|
||||
["ssh-dss"])
|
||||
|
||||
try:
|
||||
cmd = [helper_tool]
|
||||
cmd = [HELPER_TOOL]
|
||||
cmd.append(','.join(fp_blacklist))
|
||||
cmd.append(','.join(key_blacklist))
|
||||
(stdout, _stderr) = util.subp(cmd)
|
||||
|
@ -62,7 +62,7 @@ def handle(name, cfg, cloud, log, _args):
|
||||
ls_cloudcfg = cfg.get("landscape", {})
|
||||
|
||||
if not isinstance(ls_cloudcfg, dict):
|
||||
raise Exception(("'landscape' key existed in config,"
|
||||
raise Exception(("'landscape' key existed in config,"
|
||||
" but not a dictionary type,"
|
||||
" is a %s instead"), util.obj_name(ls_cloudcfg))
|
||||
|
||||
|
@ -52,7 +52,7 @@ def handle(name, cfg, cloud, log, _args):
|
||||
# It doesn't contain any sections so just add one temporarily
|
||||
# Use a hash id based off the contents,
|
||||
# just incase of conflicts... (try to not have any...)
|
||||
# This is so that an error won't occur when reading (and no
|
||||
# This is so that an error won't occur when reading (and no
|
||||
# sections exist in the file)
|
||||
section_tpl = "[nullsection_%s]"
|
||||
attempts = 0
|
||||
@ -85,7 +85,7 @@ def handle(name, cfg, cloud, log, _args):
|
||||
# the previous server.cfg and create our new one
|
||||
old_fn = "%s.old" % (server_cfg_fn)
|
||||
util.rename(server_cfg_fn, old_fn)
|
||||
# Now we got the whole file, write to disk except the section
|
||||
# Now we got the whole file, write to disk except the section
|
||||
# we added so that config parser won't error out when trying to read.
|
||||
# Note below, that we've just used ConfigParser because it generally
|
||||
# works. Below, we remove the initial 'nullsection' header.
|
||||
|
@ -24,10 +24,10 @@ import re
|
||||
|
||||
from cloudinit import util
|
||||
|
||||
# shortname matches 'sda', 'sda1', 'xvda', 'hda', 'sdb', xvdb, vda, vdd1
|
||||
shortname_filter = r"^[x]{0,1}[shv]d[a-z][0-9]*$"
|
||||
shortname = re.compile(shortname_filter)
|
||||
ws = re.compile("[%s]+" % (whitespace))
|
||||
# Shortname matches 'sda', 'sda1', 'xvda', 'hda', 'sdb', xvdb, vda, vdd1
|
||||
SHORTNAME_FILTER = r"^[x]{0,1}[shv]d[a-z][0-9]*$"
|
||||
SHORTNAME = re.compile(SHORTNAME_FILTER)
|
||||
WS = re.compile("[%s]+" % (whitespace))
|
||||
|
||||
|
||||
def is_mdname(name):
|
||||
@ -55,7 +55,6 @@ def handle(_name, cfg, cloud, log, _args):
|
||||
if "mounts" in cfg:
|
||||
cfgmnt = cfg["mounts"]
|
||||
|
||||
|
||||
for i in range(len(cfgmnt)):
|
||||
# skip something that wasn't a list
|
||||
if not isinstance(cfgmnt[i], list):
|
||||
@ -85,7 +84,7 @@ def handle(_name, cfg, cloud, log, _args):
|
||||
cfgmnt[i][0] = renamed
|
||||
log.debug("Mapped metadata name %s to %s", startname, renamed)
|
||||
else:
|
||||
if shortname.match(startname):
|
||||
if SHORTNAME.match(startname):
|
||||
renamed = "/dev/%s" % startname
|
||||
log.debug("Mapped shortname name %s to %s", startname, renamed)
|
||||
cfgmnt[i][0] = renamed
|
||||
@ -171,7 +170,7 @@ def handle(_name, cfg, cloud, log, _args):
|
||||
fstab = util.load_file(cloud.paths.join(True, "/etc/fstab"))
|
||||
for line in fstab.splitlines():
|
||||
try:
|
||||
toks = ws.split(line)
|
||||
toks = WS.split(line)
|
||||
if toks[3].find(comment) != -1:
|
||||
continue
|
||||
except:
|
||||
|
@ -26,8 +26,13 @@ from cloudinit.settings import PER_INSTANCE
|
||||
|
||||
frequency = PER_INSTANCE
|
||||
|
||||
post_list_all = ['pub_key_dsa', 'pub_key_rsa', 'pub_key_ecdsa',
|
||||
'instance_id', 'hostname']
|
||||
POST_LIST_ALL = [
|
||||
'pub_key_dsa',
|
||||
'pub_key_rsa',
|
||||
'pub_key_ecdsa',
|
||||
'instance_id',
|
||||
'hostname'
|
||||
]
|
||||
|
||||
|
||||
# phone_home:
|
||||
@ -63,7 +68,7 @@ def handle(name, cfg, cloud, log, args):
|
||||
" is not an integer, using %s instead"), tries)
|
||||
|
||||
if post_list == "all":
|
||||
post_list = post_list_all
|
||||
post_list = POST_LIST_ALL
|
||||
|
||||
all_keys = {}
|
||||
all_keys['instance_id'] = cloud.get_instance_id()
|
||||
|
@ -63,7 +63,7 @@ def handle(name, cfg, cloud, log, _args):
|
||||
util.ensure_dir(pp_ssl_dir, 0771)
|
||||
util.chownbyid(pp_ssl_dir,
|
||||
pwd.getpwnam('puppet').pw_uid, 0)
|
||||
pp_ssl_certs = cloud.paths.join(False,
|
||||
pp_ssl_certs = cloud.paths.join(False,
|
||||
'/var/lib/puppet/ssl/certs/')
|
||||
util.ensure_dir(pp_ssl_certs)
|
||||
util.chownbyid(pp_ssl_certs,
|
||||
|
@ -27,7 +27,7 @@ from cloudinit.settings import PER_ALWAYS
|
||||
|
||||
frequency = PER_ALWAYS
|
||||
|
||||
resize_fs_prefixes_cmds = [
|
||||
RESIZE_FS_PREFIXES_CMDS = [
|
||||
('ext', 'resize2fs'),
|
||||
('xfs', 'xfs_growfs'),
|
||||
]
|
||||
@ -89,16 +89,16 @@ def handle(name, cfg, cloud, log, args):
|
||||
# occurs this temporary file will still benefit from
|
||||
# auto deletion
|
||||
tfh.unlink_now()
|
||||
|
||||
|
||||
st_dev = nodeify_path(devpth, resize_what, log)
|
||||
fs_type = get_fs_type(st_dev, devpth, log)
|
||||
if not fs_type:
|
||||
log.warn("Could not determine filesystem type of %s", resize_what)
|
||||
return
|
||||
|
||||
|
||||
resizer = None
|
||||
fstype_lc = fs_type.lower()
|
||||
for (pfix, root_cmd) in resize_fs_prefixes_cmds:
|
||||
for (pfix, root_cmd) in RESIZE_FS_PREFIXES_CMDS:
|
||||
if fstype_lc.startswith(pfix):
|
||||
resizer = root_cmd
|
||||
break
|
||||
@ -112,7 +112,7 @@ def handle(name, cfg, cloud, log, args):
|
||||
resize_cmd = [resizer, devpth]
|
||||
|
||||
if resize_root == "noblock":
|
||||
# Fork to a child that will run
|
||||
# Fork to a child that will run
|
||||
# the resize command
|
||||
util.fork_cb(do_resize, resize_cmd, log)
|
||||
# Don't delete the file now in the parent
|
||||
|
@ -32,7 +32,7 @@ def handle(name, cfg, cloud, log, _args):
|
||||
|
||||
# Start by installing the salt package ...
|
||||
cloud.distro.install_packages(["salt"])
|
||||
|
||||
|
||||
# Ensure we can configure files at the right dir
|
||||
config_dir = salt_cfg.get("config_dir", '/etc/salt')
|
||||
config_dir = cloud.paths.join(False, config_dir)
|
||||
|
@ -26,16 +26,16 @@ from cloudinit.settings import PER_ALWAYS
|
||||
|
||||
frequency = PER_ALWAYS
|
||||
|
||||
script_subdir = 'per-boot'
|
||||
SCRIPT_SUBDIR = 'per-boot'
|
||||
|
||||
|
||||
def handle(name, _cfg, cloud, log, _args):
|
||||
# Comes from the following:
|
||||
# https://forums.aws.amazon.com/thread.jspa?threadID=96918
|
||||
runparts_path = os.path.join(cloud.get_cpath(), 'scripts', script_subdir)
|
||||
runparts_path = os.path.join(cloud.get_cpath(), 'scripts', SCRIPT_SUBDIR)
|
||||
try:
|
||||
util.runparts(runparts_path)
|
||||
except:
|
||||
log.warn("Failed to run transform %s (%s in %s)",
|
||||
name, script_subdir, runparts_path)
|
||||
name, SCRIPT_SUBDIR, runparts_path)
|
||||
raise
|
||||
|
@ -26,16 +26,16 @@ from cloudinit.settings import PER_INSTANCE
|
||||
|
||||
frequency = PER_INSTANCE
|
||||
|
||||
script_subdir = 'per-instance'
|
||||
SCRIPT_SUBDIR = 'per-instance'
|
||||
|
||||
|
||||
def handle(name, _cfg, cloud, log, _args):
|
||||
# Comes from the following:
|
||||
# https://forums.aws.amazon.com/thread.jspa?threadID=96918
|
||||
runparts_path = os.path.join(cloud.get_cpath(), 'scripts', script_subdir)
|
||||
runparts_path = os.path.join(cloud.get_cpath(), 'scripts', SCRIPT_SUBDIR)
|
||||
try:
|
||||
util.runparts(runparts_path)
|
||||
except:
|
||||
log.warn("Failed to run transform %s (%s in %s)",
|
||||
name, script_subdir, runparts_path)
|
||||
name, SCRIPT_SUBDIR, runparts_path)
|
||||
raise
|
||||
|
@ -26,16 +26,16 @@ from cloudinit.settings import PER_ONCE
|
||||
|
||||
frequency = PER_ONCE
|
||||
|
||||
script_subdir = 'per-once'
|
||||
SCRIPT_SUBDIR = 'per-once'
|
||||
|
||||
|
||||
def handle(name, _cfg, cloud, log, _args):
|
||||
# Comes from the following:
|
||||
# https://forums.aws.amazon.com/thread.jspa?threadID=96918
|
||||
runparts_path = os.path.join(cloud.get_cpath(), 'scripts', script_subdir)
|
||||
runparts_path = os.path.join(cloud.get_cpath(), 'scripts', SCRIPT_SUBDIR)
|
||||
try:
|
||||
util.runparts(runparts_path)
|
||||
except:
|
||||
log.warn("Failed to run transform %s (%s in %s)",
|
||||
name, script_subdir, runparts_path)
|
||||
name, SCRIPT_SUBDIR, runparts_path)
|
||||
raise
|
||||
|
@ -26,17 +26,17 @@ from cloudinit.settings import PER_INSTANCE
|
||||
|
||||
frequency = PER_INSTANCE
|
||||
|
||||
script_subdir = 'scripts'
|
||||
SCRIPT_SUBDIR = 'scripts'
|
||||
|
||||
|
||||
def handle(name, _cfg, cloud, log, _args):
|
||||
# This is written to by the user data handlers
|
||||
# Ie, any custom shell scripts that come down
|
||||
# go here...
|
||||
runparts_path = os.path.join(cloud.get_ipath_cur(), script_subdir)
|
||||
runparts_path = os.path.join(cloud.get_ipath_cur(), SCRIPT_SUBDIR)
|
||||
try:
|
||||
util.runparts(runparts_path)
|
||||
except:
|
||||
log.warn("Failed to run transform %s (%s in %s)",
|
||||
name, script_subdir, runparts_path)
|
||||
name, SCRIPT_SUBDIR, runparts_path)
|
||||
raise
|
||||
|
@ -25,7 +25,7 @@ from cloudinit import util
|
||||
from string import letters, digits # pylint: disable=W0402
|
||||
|
||||
# We are removing certain 'painful' letters/numbers
|
||||
pw_set = (letters.translate(None, 'loLOI') +
|
||||
PW_SET = (letters.translate(None, 'loLOI') +
|
||||
digits.translate(None, '01'))
|
||||
|
||||
|
||||
@ -148,4 +148,4 @@ def handle(_name, cfg, cloud, log, args):
|
||||
|
||||
|
||||
def rand_user_password(pwlen=9):
|
||||
return util.rand_str(pwlen, select_from=pw_set)
|
||||
return util.rand_str(pwlen, select_from=PW_SET)
|
||||
|
@ -24,11 +24,11 @@ import glob
|
||||
from cloudinit import util
|
||||
from cloudinit import ssh_util
|
||||
|
||||
DISABLE_ROOT_OPTS = ( "no-port-forwarding,no-agent-forwarding,"
|
||||
"no-X11-forwarding,command=\"echo \'Please login as the user \\\"$USER\\\" "
|
||||
DISABLE_ROOT_OPTS = ("no-port-forwarding,no-agent-forwarding,"
|
||||
"no-X11-forwarding,command=\"echo \'Please login as the user \\\"$USER\\\" "
|
||||
"rather than the user \\\"root\\\".\';echo;sleep 10\"")
|
||||
|
||||
key2file = {
|
||||
KEY_2_FILE = {
|
||||
"rsa_private": ("/etc/ssh/ssh_host_rsa_key", 0600),
|
||||
"rsa_public": ("/etc/ssh/ssh_host_rsa_key.pub", 0644),
|
||||
"dsa_private": ("/etc/ssh/ssh_host_dsa_key", 0600),
|
||||
@ -37,15 +37,17 @@ key2file = {
|
||||
"ecdsa_public": ("/etc/ssh/ssh_host_ecdsa_key.pub", 0644),
|
||||
}
|
||||
|
||||
priv2pub = {
|
||||
'rsa_private': 'rsa_public',
|
||||
PRIV_2_PUB = {
|
||||
'rsa_private': 'rsa_public',
|
||||
'dsa_private': 'dsa_public',
|
||||
'ecdsa_private': 'ecdsa_public',
|
||||
}
|
||||
|
||||
key_gen_tpl = 'o=$(ssh-keygen -yf "%s") && echo "$o" root@localhost > "%s"'
|
||||
KEY_GEN_TPL = 'o=$(ssh-keygen -yf "%s") && echo "$o" root@localhost > "%s"'
|
||||
|
||||
generate_keys = ['rsa', 'dsa', 'ecdsa']
|
||||
GENERATE_KEY_NAMES = ['rsa', 'dsa', 'ecdsa']
|
||||
|
||||
KEY_FILE_TPL = '/etc/ssh/ssh_host_%s_key'
|
||||
|
||||
|
||||
def handle(_name, cfg, cloud, log, _args):
|
||||
@ -58,21 +60,21 @@ def handle(_name, cfg, cloud, log, _args):
|
||||
util.del_file(f)
|
||||
except:
|
||||
util.logexc(log, "Failed deleting key file %s", f)
|
||||
|
||||
|
||||
if "ssh_keys" in cfg:
|
||||
# if there are keys in cloud-config, use them
|
||||
for (key, val) in cfg["ssh_keys"].iteritems():
|
||||
if key in key2file:
|
||||
tgt_fn = key2file[key][0]
|
||||
tgt_perms = key2file[key][1]
|
||||
if key in KEY_2_FILE:
|
||||
tgt_fn = KEY_2_FILE[key][0]
|
||||
tgt_perms = KEY_2_FILE[key][1]
|
||||
util.write_file(cloud.paths.join(False, tgt_fn),
|
||||
val, tgt_perms)
|
||||
|
||||
for (priv, pub) in priv2pub.iteritems():
|
||||
for (priv, pub) in PRIV_2_PUB.iteritems():
|
||||
if pub in cfg['ssh_keys'] or not priv in cfg['ssh_keys']:
|
||||
continue
|
||||
pair = (key2file[priv][0], key2file[pub][0])
|
||||
cmd = ['sh', '-xc', key_gen_tpl % pair]
|
||||
pair = (KEY_2_FILE[priv][0], KEY_2_FILE[pub][0])
|
||||
cmd = ['sh', '-xc', KEY_GEN_TPL % pair]
|
||||
try:
|
||||
# TODO: Is this guard needed?
|
||||
with util.SeLinuxGuard("/etc/ssh", recursive=True):
|
||||
@ -84,12 +86,11 @@ def handle(_name, cfg, cloud, log, _args):
|
||||
else:
|
||||
# if not, generate them
|
||||
genkeys = util.get_cfg_option_list(cfg,
|
||||
'ssh_genkeytypes',
|
||||
generate_keys)
|
||||
'ssh_genkeytypes',
|
||||
GENERATE_KEY_NAMES)
|
||||
for keytype in genkeys:
|
||||
keyfile = '/etc/ssh/ssh_host_%s_key' % (keytype)
|
||||
keyfile = cloud.paths.join(False, keyfile)
|
||||
util.ensure_dir(os.path.dirname(keyfile))
|
||||
keyfile = cloud.paths.join(False, KEY_FILE_TPL % (keytype))
|
||||
util.ensure_dir(os.path.dirname(keyfile))
|
||||
if not os.path.exists(keyfile):
|
||||
cmd = ['ssh-keygen', '-t', keytype, '-N', '', '-f', keyfile]
|
||||
try:
|
||||
|
@ -157,4 +157,3 @@ def fetch(distro_name, mods=(__name__, )):
|
||||
% (distro_name))
|
||||
distro_cls = getattr(mod, 'Distro')
|
||||
return distro_cls
|
||||
|
||||
|
@ -35,7 +35,7 @@ class Distro(distros.Distro):
|
||||
|
||||
def __init__(self, name, cfg, paths):
|
||||
distros.Distro.__init__(self, name, cfg, paths)
|
||||
|
||||
|
||||
def install_packages(self, pkglist):
|
||||
self.package_command('install', pkglist)
|
||||
|
||||
@ -210,12 +210,12 @@ class Distro(distros.Distro):
|
||||
def package_command(self, command, args=None):
|
||||
cmd = ['yum']
|
||||
# If enabled, then yum will be tolerant of errors on the command line
|
||||
# with regard to packages.
|
||||
# For example: if you request to install foo, bar and baz and baz is
|
||||
# with regard to packages.
|
||||
# For example: if you request to install foo, bar and baz and baz is
|
||||
# installed; yum won't error out complaining that baz is already
|
||||
# installed.
|
||||
# installed.
|
||||
cmd.append("-t")
|
||||
# Determines whether or not yum prompts for confirmation
|
||||
# Determines whether or not yum prompts for confirmation
|
||||
# of critical actions. We don't want to prompt...
|
||||
cmd.append("-y")
|
||||
cmd.append(command)
|
||||
@ -223,8 +223,8 @@ class Distro(distros.Distro):
|
||||
cmd.extend(args)
|
||||
# Allow the output of this to flow outwards (ie not be captured)
|
||||
util.subp(cmd, capture=False)
|
||||
|
||||
|
||||
|
||||
|
||||
# This is a util function to translate a ubuntu /etc/network/interfaces 'blob'
|
||||
# to a rhel equiv. that can then be written to /etc/sysconfig/network-scripts/
|
||||
# TODO remove when we have python-netcf active...
|
||||
|
@ -36,11 +36,11 @@ class Distro(distros.Distro):
|
||||
|
||||
def __init__(self, name, cfg, paths):
|
||||
distros.Distro.__init__(self, name, cfg, paths)
|
||||
# This will be used to restrict certain
|
||||
# This will be used to restrict certain
|
||||
# calls from repeatly happening (when they
|
||||
# should only happen say once per instance...)
|
||||
self._runner = helpers.Runners(paths)
|
||||
|
||||
|
||||
def install_packages(self, pkglist):
|
||||
self._update_package_sources()
|
||||
self.package_command('install', pkglist)
|
||||
@ -131,4 +131,4 @@ class Distro(distros.Distro):
|
||||
|
||||
def _update_package_sources(self):
|
||||
self._runner.run("update-sources", self.package_command,
|
||||
["update"], freq=PER_INSTANCE)
|
||||
["update"], freq=PER_INSTANCE)
|
||||
|
@ -104,7 +104,7 @@ def run_part(mod, data, ctype, filename, payload, frequency):
|
||||
except:
|
||||
mod_ver = 1
|
||||
try:
|
||||
LOG.debug("Calling handler %s (%s, %s, %s) with frequency %s",
|
||||
LOG.debug("Calling handler %s (%s, %s, %s) with frequency %s",
|
||||
mod, ctype, filename, mod_ver, frequency)
|
||||
if mod_ver >= 2:
|
||||
# Treat as v. 2 which does get a frequency
|
||||
@ -114,7 +114,7 @@ def run_part(mod, data, ctype, filename, payload, frequency):
|
||||
mod.handle_part(data, ctype, filename, payload)
|
||||
except:
|
||||
util.logexc(LOG, ("Failed calling handler %s (%s, %s, %s)"
|
||||
" with frequency %s"),
|
||||
" with frequency %s"),
|
||||
mod, ctype, filename,
|
||||
mod_ver, frequency)
|
||||
|
||||
@ -178,7 +178,7 @@ def walker_callback(pdata, ctype, filename, payload):
|
||||
payload, pdata['frequency'])
|
||||
|
||||
|
||||
# Callback is a function that will be called with
|
||||
# Callback is a function that will be called with
|
||||
# (data, content_type, filename, payload)
|
||||
def walk(msg, callback, data):
|
||||
partnum = 0
|
||||
@ -226,5 +226,3 @@ def type_from_starts_with(payload, default=None):
|
||||
if payload_lc.startswith(text):
|
||||
return INCLUSION_TYPES_MAP[text]
|
||||
return default
|
||||
|
||||
|
||||
|
@ -84,7 +84,7 @@ class FileSemaphores(object):
|
||||
try:
|
||||
util.del_dir(self.sem_path)
|
||||
except (IOError, OSError):
|
||||
util.logexc(LOG, "Failed deleting semaphore directory %s",
|
||||
util.logexc(LOG, "Failed deleting semaphore directory %s",
|
||||
self.sem_path)
|
||||
|
||||
def _acquire(self, name, freq):
|
||||
@ -212,7 +212,7 @@ class Paths(object):
|
||||
self.cfgs = path_cfgs
|
||||
# Populate all the initial paths
|
||||
self.cloud_dir = self.join(False,
|
||||
path_cfgs.get('cloud_dir',
|
||||
path_cfgs.get('cloud_dir',
|
||||
'/var/lib/cloud'))
|
||||
self.instance_link = os.path.join(self.cloud_dir, 'instance')
|
||||
self.boot_finished = os.path.join(self.instance_link, "boot-finished")
|
||||
@ -237,7 +237,7 @@ class Paths(object):
|
||||
# Set when a datasource becomes active
|
||||
self.datasource = ds
|
||||
|
||||
# joins the paths but also appends a read
|
||||
# joins the paths but also appends a read
|
||||
# or write root if available
|
||||
def join(self, read_only, *paths):
|
||||
if read_only:
|
||||
|
@ -20,7 +20,6 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
import logging
|
||||
import logging.handlers
|
||||
import logging.config
|
||||
@ -53,7 +52,6 @@ def setupBasicLogging():
|
||||
root.setLevel(DEBUG)
|
||||
|
||||
|
||||
|
||||
def setupLogging(cfg=None):
|
||||
# See if the config provides any logging conf...
|
||||
if not cfg:
|
||||
|
@ -47,7 +47,7 @@ CFG_BUILTIN = {
|
||||
'paths': {
|
||||
'cloud_dir': '/var/lib/cloud',
|
||||
'templates_dir': '/etc/cloud/templates/',
|
||||
},
|
||||
},
|
||||
'distro': 'ubuntu',
|
||||
},
|
||||
}
|
||||
|
@ -121,7 +121,7 @@ class DataSourceCloudStack(sources.DataSource):
|
||||
None, self.metadata_address)
|
||||
self.metadata = boto_utils.get_instance_metadata(self.api_ver,
|
||||
self.metadata_address)
|
||||
LOG.debug("Crawl of metadata service took %s seconds",
|
||||
LOG.debug("Crawl of metadata service took %s seconds",
|
||||
int(time.time() - start_time))
|
||||
return True
|
||||
except Exception:
|
||||
|
@ -36,7 +36,7 @@ CFG_DRIVE_FILES = [
|
||||
"meta.js",
|
||||
]
|
||||
DEFAULT_METADATA = {
|
||||
"instance-id": DEFAULT_IID,
|
||||
"instance-id": DEFAULT_IID,
|
||||
"dsmode": DEFAULT_MODE,
|
||||
}
|
||||
CFG_DRIVE_DEV_ENV = 'CLOUD_INIT_CONFIG_DRIVE_DEVICE'
|
||||
|
@ -38,7 +38,7 @@ DEF_MD_URL = "http://169.254.169.254"
|
||||
DEF_MD_VERSION = '2009-04-04'
|
||||
|
||||
# Default metadata urls that will be used if none are provided
|
||||
# They will be checked for 'resolveability' and some of the
|
||||
# They will be checked for 'resolveability' and some of the
|
||||
# following may be discarded if they do not resolve
|
||||
DEF_MD_URLS = [DEF_MD_URL, "http://instance-data:8773"]
|
||||
|
||||
@ -69,7 +69,7 @@ class DataSourceEc2(sources.DataSource):
|
||||
None, self.metadata_address)
|
||||
self.metadata = boto_utils.get_instance_metadata(self.api_ver,
|
||||
self.metadata_address)
|
||||
LOG.debug("Crawl of metadata service took %s seconds",
|
||||
LOG.debug("Crawl of metadata service took %s seconds",
|
||||
int(time.time() - start_time))
|
||||
return True
|
||||
except Exception:
|
||||
@ -201,7 +201,7 @@ class DataSourceEc2(sources.DataSource):
|
||||
return None
|
||||
|
||||
# Example:
|
||||
# 'block-device-mapping':
|
||||
# 'block-device-mapping':
|
||||
# {'ami': '/dev/sda1',
|
||||
# 'ephemeral0': '/dev/sdb',
|
||||
# 'root': '/dev/sda1'}
|
||||
|
@ -251,6 +251,7 @@ datasources = [
|
||||
(DataSourceMAAS, (sources.DEP_FILESYSTEM, sources.DEP_NETWORK)),
|
||||
]
|
||||
|
||||
|
||||
# Return a list of data sources that match this set of dependencies
|
||||
def get_datasource_list(depends):
|
||||
return sources.list_from_depends(depends, datasources)
|
||||
|
@ -154,7 +154,7 @@ class DataSourceNoCloud(sources.DataSource):
|
||||
(self.dsmode in ("local", seeded_interfaces))):
|
||||
LOG.info("Updating network interfaces from %s", self)
|
||||
self.distro.apply_network(md['network-interfaces'])
|
||||
|
||||
|
||||
if md['dsmode'] == self.dsmode:
|
||||
self.seed = ",".join(found)
|
||||
self.metadata = md
|
||||
|
@ -103,10 +103,10 @@ class AuthKeyLineParser(object):
|
||||
elif curc == '"':
|
||||
quoted = not quoted
|
||||
i = i + 1
|
||||
|
||||
|
||||
options = ent[0:i]
|
||||
options_lst = []
|
||||
|
||||
|
||||
# Now use a csv parser to pull the options
|
||||
# out of the above string that we just found an endpoint for.
|
||||
#
|
||||
@ -211,7 +211,6 @@ def update_authorized_keys(fname, keys):
|
||||
|
||||
|
||||
def setup_user_keys(keys, user, key_prefix, paths):
|
||||
|
||||
# Make sure the users .ssh dir is setup accordingly
|
||||
pwent = pwd.getpwnam(user)
|
||||
ssh_dir = os.path.join(pwent.pw_dir, '.ssh')
|
||||
|
@ -287,7 +287,7 @@ class Init(object):
|
||||
|
||||
def cloudify(self):
|
||||
# Form the needed options to cloudify our members
|
||||
return cloud.Cloud(self.datasource,
|
||||
return cloud.Cloud(self.datasource,
|
||||
self.paths, self.cfg,
|
||||
self.distro, helpers.Runners(self.paths))
|
||||
|
||||
@ -318,7 +318,7 @@ class Init(object):
|
||||
def consume(self, frequency=PER_INSTANCE):
|
||||
cdir = self.paths.get_cpath("handlers")
|
||||
idir = self.paths.get_ipath("handlers")
|
||||
|
||||
|
||||
# Add the path to the plugins dir to the top of our list for import
|
||||
# instance dir should be read before cloud-dir
|
||||
if cdir and cdir not in sys.path:
|
||||
@ -417,7 +417,7 @@ class Modules(object):
|
||||
except:
|
||||
util.logexc(LOG, ("Failed loading of datasource"
|
||||
" config object from %s"), self.datasource)
|
||||
|
||||
|
||||
if self.base_cfg:
|
||||
t_cfgs.append(self.base_cfg)
|
||||
|
||||
|
@ -47,11 +47,11 @@ class UrlResponse(object):
|
||||
@property
|
||||
def contents(self):
|
||||
return self._contents
|
||||
|
||||
|
||||
@property
|
||||
def headers(self):
|
||||
return self._headers
|
||||
|
||||
|
||||
def __str__(self):
|
||||
if not self.contents:
|
||||
return ''
|
||||
@ -66,7 +66,7 @@ class UrlResponse(object):
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
|
||||
def readurl(url, data=None, timeout=None,
|
||||
retries=0, sec_between=1, headers=None):
|
||||
@ -89,8 +89,8 @@ def readurl(url, data=None, timeout=None,
|
||||
|
||||
excepts = []
|
||||
LOG.info(("Attempting to open '%s' with %s attempts"
|
||||
" (%s retries, timeout=%s) to be performed"),
|
||||
url, attempts, retries, timeout)
|
||||
" (%s retries, timeout=%s) to be performed"),
|
||||
url, attempts, retries, timeout)
|
||||
open_args = {}
|
||||
if timeout is not None:
|
||||
open_args['timeout'] = int(timeout)
|
||||
@ -112,7 +112,7 @@ def readurl(url, data=None, timeout=None,
|
||||
excepts.append(e)
|
||||
except urllib2.URLError as e:
|
||||
# This can be a message string or
|
||||
# another exception instance
|
||||
# another exception instance
|
||||
# (socket.error for remote URLs, OSError for local URLs).
|
||||
if (isinstance(e.reason, (OSError)) and
|
||||
e.reason.errno == errno.ENOENT):
|
||||
@ -128,7 +128,7 @@ def readurl(url, data=None, timeout=None,
|
||||
|
||||
# Didn't work out
|
||||
LOG.warn("Failed reading from %s after %s attempts", url, attempts)
|
||||
|
||||
|
||||
# It must of errored at least once for code
|
||||
# to get here so re-raise the last error
|
||||
LOG.debug("%s errors occured, re-raising the last one", len(excepts))
|
||||
|
@ -65,33 +65,33 @@ class UserDataProcessor(object):
|
||||
# multipart/* are just containers
|
||||
if part.get_content_maintype() == 'multipart':
|
||||
continue
|
||||
|
||||
|
||||
ctype = None
|
||||
ctype_orig = part.get_content_type()
|
||||
payload = part.get_payload(decode=True)
|
||||
|
||||
|
||||
if not ctype_orig:
|
||||
ctype_orig = UNDEF_TYPE
|
||||
|
||||
|
||||
if ctype_orig in TYPE_NEEDED:
|
||||
ctype = handlers.type_from_starts_with(payload)
|
||||
|
||||
|
||||
if ctype is None:
|
||||
ctype = ctype_orig
|
||||
|
||||
|
||||
if ctype in INCLUDE_TYPES:
|
||||
self._do_include(payload, append_msg)
|
||||
continue
|
||||
|
||||
|
||||
if ctype in ARCHIVE_TYPES:
|
||||
self._explode_archive(payload, append_msg)
|
||||
continue
|
||||
|
||||
|
||||
if 'Content-Type' in base_msg:
|
||||
base_msg.replace_header('Content-Type', ctype)
|
||||
else:
|
||||
base_msg['Content-Type'] = ctype
|
||||
|
||||
|
||||
self._attach_part(append_msg, part)
|
||||
|
||||
def _get_include_once_filename(self, entry):
|
||||
@ -108,8 +108,8 @@ class UserDataProcessor(object):
|
||||
lc_line = line.lower()
|
||||
if lc_line.startswith("#include-once"):
|
||||
line = line[len("#include-once"):].lstrip()
|
||||
# Every following include will now
|
||||
# not be refetched.... but will be
|
||||
# Every following include will now
|
||||
# not be refetched.... but will be
|
||||
# re-read from a local urlcache (if it worked)
|
||||
include_once_on = True
|
||||
elif lc_line.startswith("#include"):
|
||||
@ -190,10 +190,10 @@ class UserDataProcessor(object):
|
||||
"""
|
||||
if ATTACHMENT_FIELD not in outer_msg:
|
||||
outer_msg[ATTACHMENT_FIELD] = '0'
|
||||
|
||||
|
||||
if new_count is not None:
|
||||
outer_msg.replace_header(ATTACHMENT_FIELD, str(new_count))
|
||||
|
||||
|
||||
fetched_count = 0
|
||||
try:
|
||||
fetched_count = int(outer_msg.get(ATTACHMENT_FIELD))
|
||||
@ -234,7 +234,3 @@ def convert_string(raw_data, headers=None):
|
||||
msg = MIMEBase(maintype, subtype, *headers)
|
||||
msg.set_payload(data)
|
||||
return msg
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -35,7 +35,7 @@ import pwd
|
||||
import random
|
||||
import shutil
|
||||
import socket
|
||||
import string # pylint: disable=W0402
|
||||
import string # pylint: disable=W0402
|
||||
import subprocess
|
||||
import sys
|
||||
import tempfile
|
||||
@ -153,13 +153,15 @@ def SilentTemporaryFile(**kwargs):
|
||||
# file to unlink has been unlinked elsewhere..
|
||||
LOG.debug("Created temporary file %s", fh.name)
|
||||
fh.unlink = del_file
|
||||
# Add a new method that will unlink
|
||||
|
||||
# Add a new method that will unlink
|
||||
# right 'now' but still lets the exit
|
||||
# method attempt to remove it (which will
|
||||
# not throw due to our del file being quiet
|
||||
# about files that are not there)
|
||||
def unlink_now():
|
||||
fh.unlink(fh.name)
|
||||
|
||||
setattr(fh, 'unlink_now', unlink_now)
|
||||
return fh
|
||||
|
||||
@ -199,7 +201,7 @@ def is_false_str(val, addons=None):
|
||||
|
||||
def translate_bool(val, addons=None):
|
||||
if not val:
|
||||
# This handles empty lists and false and
|
||||
# This handles empty lists and false and
|
||||
# other things that python believes are false
|
||||
return False
|
||||
# If its already a boolean skip
|
||||
@ -214,7 +216,6 @@ def rand_str(strlen=32, select_from=None):
|
||||
return "".join([random.choice(select_from) for _x in range(0, strlen)])
|
||||
|
||||
|
||||
|
||||
def read_conf(fname):
|
||||
try:
|
||||
return load_yaml(load_file(fname), default={})
|
||||
@ -275,7 +276,7 @@ def is_ipv4(instr):
|
||||
|
||||
def merge_base_cfg(cfgfile, cfg_builtin=None):
|
||||
syscfg = read_conf_with_confd(cfgfile)
|
||||
|
||||
|
||||
kern_contents = read_cc_from_cmdline()
|
||||
kerncfg = {}
|
||||
if kern_contents:
|
||||
@ -575,7 +576,7 @@ def load_yaml(blob, default=None, allowed=(dict,)):
|
||||
try:
|
||||
blob = str(blob)
|
||||
LOG.debug(("Attempting to load yaml from string "
|
||||
"of length %s with allowed root types %s"),
|
||||
"of length %s with allowed root types %s"),
|
||||
len(blob), allowed)
|
||||
converted = yaml.load(blob)
|
||||
if not isinstance(converted, allowed):
|
||||
@ -625,7 +626,7 @@ def read_conf_d(confd):
|
||||
|
||||
# remove anything not ending in '.cfg'
|
||||
confs = [f for f in confs if f.endswith(".cfg")]
|
||||
|
||||
|
||||
# remove anything not a file
|
||||
confs = [f for f in confs if os.path.isfile(os.path.join(confd, f))]
|
||||
|
||||
@ -726,9 +727,9 @@ def get_fqdn_from_hosts(hostname, filename="/etc/hosts"):
|
||||
"""
|
||||
For each host a single line should be present with
|
||||
the following information:
|
||||
|
||||
IP_address canonical_hostname [aliases...]
|
||||
|
||||
|
||||
IP_address canonical_hostname [aliases...]
|
||||
|
||||
Fields of the entry are separated by any number of blanks and/or tab
|
||||
characters. Text from a "#" character until the end of the line is a
|
||||
comment, and is ignored. Host names may contain only alphanumeric
|
||||
@ -747,7 +748,7 @@ def get_fqdn_from_hosts(hostname, filename="/etc/hosts"):
|
||||
if not line:
|
||||
continue
|
||||
|
||||
# If there there is less than 3 entries
|
||||
# If there there is less than 3 entries
|
||||
# (IP_address, canonical_hostname, alias)
|
||||
# then ignore this line
|
||||
toks = line.split()
|
||||
@ -829,7 +830,7 @@ def close_stdin():
|
||||
os.dup2(fp.fileno(), sys.stdin.fileno())
|
||||
|
||||
|
||||
def find_devs_with(criteria=None, oformat='device',
|
||||
def find_devs_with(criteria=None, oformat='device',
|
||||
tag=None, no_cache=False, path=None):
|
||||
"""
|
||||
find devices matching given criteria (via blkid)
|
||||
@ -841,23 +842,23 @@ def find_devs_with(criteria=None, oformat='device',
|
||||
blk_id_cmd = ['blkid']
|
||||
options = []
|
||||
if criteria:
|
||||
# Search for block devices with tokens named NAME that
|
||||
# Search for block devices with tokens named NAME that
|
||||
# have the value 'value' and display any devices which are found.
|
||||
# Common values for NAME include TYPE, LABEL, and UUID.
|
||||
# If there are no devices specified on the command line,
|
||||
# all block devices will be searched; otherwise,
|
||||
# all block devices will be searched; otherwise,
|
||||
# only search the devices specified by the user.
|
||||
options.append("-t%s" % (criteria))
|
||||
if tag:
|
||||
# For each (specified) device, show only the tags that match tag.
|
||||
options.append("-s%s" % (tag))
|
||||
if no_cache:
|
||||
# If you want to start with a clean cache
|
||||
# (i.e. don't report devices previously scanned
|
||||
# If you want to start with a clean cache
|
||||
# (i.e. don't report devices previously scanned
|
||||
# but not necessarily available at this time), specify /dev/null.
|
||||
options.extend(["-c", "/dev/null"])
|
||||
if oformat:
|
||||
# Display blkid's output using the specified format.
|
||||
# Display blkid's output using the specified format.
|
||||
# The format parameter may be:
|
||||
# full, value, list, device, udev, export
|
||||
options.append('-o%s' % (oformat))
|
||||
@ -1104,7 +1105,7 @@ def mounts():
|
||||
(dev, mp, fstype, opts, _freq, _passno) = mpline.split()
|
||||
except:
|
||||
continue
|
||||
# If the name of the mount point contains spaces these
|
||||
# If the name of the mount point contains spaces these
|
||||
# can be escaped as '\040', so undo that..
|
||||
mp = mp.replace("\\040", " ")
|
||||
mounted[dev] = {
|
||||
|
Loading…
x
Reference in New Issue
Block a user