Merge remote-tracking branch 'cdist/master'
This commit is contained in:
commit
840254cdd3
7 changed files with 53 additions and 132 deletions
|
@ -101,7 +101,7 @@ if __name__ == "__main__":
|
||||||
|
|
||||||
if re.match(TYPE_PREFIX, os.path.basename(sys.argv[0])):
|
if re.match(TYPE_PREFIX, os.path.basename(sys.argv[0])):
|
||||||
import cdist.emulator
|
import cdist.emulator
|
||||||
cdist.emulator.emulator(sys.argv)
|
cdist.emulator.run(sys.argv)
|
||||||
else:
|
else:
|
||||||
import cdist
|
import cdist
|
||||||
import cdist.banner
|
import cdist.banner
|
||||||
|
|
|
@ -65,7 +65,7 @@ if [ -f /etc/SuSE-release ]; then
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if uname -r | grep -s '.owl' >/dev/null 2>&1; then
|
if [ -f /etc/owl-release ]; then
|
||||||
echo owl
|
echo owl
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -42,6 +42,9 @@ case "$($__explorer/os)" in
|
||||||
*bsd|solaris)
|
*bsd|solaris)
|
||||||
uname -r
|
uname -r
|
||||||
;;
|
;;
|
||||||
|
owl)
|
||||||
|
cat /etc/owl-release
|
||||||
|
;;
|
||||||
redhat|centos)
|
redhat|centos)
|
||||||
cat /etc/redhat-release
|
cat /etc/redhat-release
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -24,9 +24,11 @@ import datetime
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import stat
|
import stat
|
||||||
|
import sys
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
import cdist.emulator
|
||||||
import cdist.path
|
import cdist.path
|
||||||
|
|
||||||
CODE_HEADER = "#!/bin/sh -e\n"
|
CODE_HEADER = "#!/bin/sh -e\n"
|
||||||
|
@ -35,12 +37,18 @@ class Config:
|
||||||
"""Cdist main class to hold arbitrary data"""
|
"""Cdist main class to hold arbitrary data"""
|
||||||
|
|
||||||
def __init__(self, target_host,
|
def __init__(self, target_host,
|
||||||
initial_manifest=False, remote_user="root",
|
initial_manifest=False,
|
||||||
home=None, debug=False):
|
remote_user="root",
|
||||||
|
home=None,
|
||||||
|
exec_path=sys.argv[0],
|
||||||
|
debug=False):
|
||||||
|
|
||||||
self.target_host = target_host
|
self.target_host = target_host
|
||||||
self.debug = debug
|
self.debug = debug
|
||||||
self.remote_user = remote_user
|
self.remote_user = remote_user
|
||||||
|
self.exec_path = exec_path
|
||||||
|
|
||||||
|
# FIXME: broken - construct elsewhere!
|
||||||
self.remote_prefix = ["ssh", self.remote_user + "@" + self.target_host]
|
self.remote_prefix = ["ssh", self.remote_user + "@" + self.target_host]
|
||||||
|
|
||||||
self.path = cdist.path.Path(self.target_host,
|
self.path = cdist.path.Path(self.target_host,
|
||||||
|
@ -94,7 +102,7 @@ class Config:
|
||||||
output = os.path.join(self.path.type_explorer_output_dir(cdist_object), explorer)
|
output = os.path.join(self.path.type_explorer_output_dir(cdist_object), explorer)
|
||||||
output_fd = open(output, mode='w')
|
output_fd = open(output, mode='w')
|
||||||
log.debug("%s exploring %s using %s storing to %s",
|
log.debug("%s exploring %s using %s storing to %s",
|
||||||
cdist_object, explorer, remote_cmd, output)
|
cdist_object, explorer, remote_cmd, output)
|
||||||
|
|
||||||
cdist.exec.run_or_fail(remote_cmd, stdout=output_fd, remote_prefix=self.remote_prefix)
|
cdist.exec.run_or_fail(remote_cmd, stdout=output_fd, remote_prefix=self.remote_prefix)
|
||||||
output_fd.close()
|
output_fd.close()
|
||||||
|
@ -106,6 +114,9 @@ class Config:
|
||||||
self.path.remove_remote_dir(cdist.path.REMOTE_BASE_DIR)
|
self.path.remove_remote_dir(cdist.path.REMOTE_BASE_DIR)
|
||||||
self.path.remote_mkdir(cdist.path.REMOTE_BASE_DIR)
|
self.path.remote_mkdir(cdist.path.REMOTE_BASE_DIR)
|
||||||
|
|
||||||
|
cdist.emulator.link(self.exec_path,
|
||||||
|
self.path.bin_dir, self.path.list_types())
|
||||||
|
|
||||||
def run_initial_manifest(self):
|
def run_initial_manifest(self):
|
||||||
"""Run the initial manifest"""
|
"""Run the initial manifest"""
|
||||||
env = { "__manifest" : self.path.manifest_dir }
|
env = { "__manifest" : self.path.manifest_dir }
|
||||||
|
@ -135,12 +146,6 @@ class Config:
|
||||||
env['__target_host'] = self.target_host
|
env['__target_host'] = self.target_host
|
||||||
env['__global'] = self.path.out_dir
|
env['__global'] = self.path.out_dir
|
||||||
|
|
||||||
# Legacy stuff to make cdist-type-emulator work
|
|
||||||
env['__cdist_core_dir'] = os.path.join(self.path.base_dir, "core")
|
|
||||||
env['__cdist_local_base_dir'] = self.path.temp_dir
|
|
||||||
|
|
||||||
# Submit information to new type emulator
|
|
||||||
|
|
||||||
# Required for recording source
|
# Required for recording source
|
||||||
env['__cdist_manifest'] = manifest
|
env['__cdist_manifest'] = manifest
|
||||||
|
|
||||||
|
@ -299,95 +304,3 @@ def config(args):
|
||||||
time_end = datetime.datetime.now()
|
time_end = datetime.datetime.now()
|
||||||
log.info("Total processing time for %s host(s): %s", len(args.host),
|
log.info("Total processing time for %s host(s): %s", len(args.host),
|
||||||
(time_end - time_start).total_seconds())
|
(time_end - time_start).total_seconds())
|
||||||
|
|
||||||
def install(args):
|
|
||||||
"""Install remote system"""
|
|
||||||
process = {}
|
|
||||||
|
|
||||||
def commandline():
|
|
||||||
"""Parse command line"""
|
|
||||||
# Construct parser others can reuse
|
|
||||||
parser = {}
|
|
||||||
# Options _all_ parsers have in common
|
|
||||||
parser['most'] = argparse.ArgumentParser(add_help=False)
|
|
||||||
parser['most'].add_argument('-d', '--debug',
|
|
||||||
help='Set log level to debug', action='store_true')
|
|
||||||
|
|
||||||
# Main subcommand parser
|
|
||||||
parser['main'] = argparse.ArgumentParser(description='cdist ' + cdist.VERSION)
|
|
||||||
parser['main'].add_argument('-V', '--version',
|
|
||||||
help='Show version', action='version',
|
|
||||||
version='%(prog)s ' + cdist.VERSION)
|
|
||||||
parser['sub'] = parser['main'].add_subparsers(title="Commands")
|
|
||||||
|
|
||||||
# Banner
|
|
||||||
parser['banner'] = parser['sub'].add_parser('banner',
|
|
||||||
add_help=False)
|
|
||||||
parser['banner'].set_defaults(func=cdist.banner.banner)
|
|
||||||
|
|
||||||
# Config and install (common stuff)
|
|
||||||
parser['configinstall'] = argparse.ArgumentParser(add_help=False)
|
|
||||||
parser['configinstall'].add_argument('host', nargs='+',
|
|
||||||
help='one or more hosts to operate on')
|
|
||||||
parser['configinstall'].add_argument('-c', '--cdist-home',
|
|
||||||
help='Change cdist home (default: .. from bin directory)',
|
|
||||||
action='store')
|
|
||||||
parser['configinstall'].add_argument('-i', '--initial-manifest',
|
|
||||||
help='Path to a cdist manifest',
|
|
||||||
dest='manifest', required=False)
|
|
||||||
parser['configinstall'].add_argument('-p', '--parallel',
|
|
||||||
help='Operate on multiple hosts in parallel',
|
|
||||||
action='store_true', dest='parallel')
|
|
||||||
parser['configinstall'].add_argument('-s', '--sequential',
|
|
||||||
help='Operate on multiple hosts sequentially (default)',
|
|
||||||
action='store_false', dest='parallel')
|
|
||||||
|
|
||||||
# Config
|
|
||||||
parser['config'] = parser['sub'].add_parser('config',
|
|
||||||
parents=[parser['most'], parser['configinstall']])
|
|
||||||
parser['config'].set_defaults(func=config)
|
|
||||||
|
|
||||||
# Install
|
|
||||||
parser['install'] = parser['sub'].add_parser('install',
|
|
||||||
parents=[parser['most'], parser['configinstall']])
|
|
||||||
parser['install'].set_defaults(func=install)
|
|
||||||
|
|
||||||
for p in parser:
|
|
||||||
parser[p].epilog = "Get cdist at http://www.nico.schottelius.org/software/cdist/"
|
|
||||||
|
|
||||||
args = parser['main'].parse_args(sys.argv[1:])
|
|
||||||
|
|
||||||
# Most subcommands have --debug, so handle it here
|
|
||||||
if 'debug' in args:
|
|
||||||
if args.debug:
|
|
||||||
logging.root.setLevel(logging.DEBUG)
|
|
||||||
log.debug(args)
|
|
||||||
|
|
||||||
args.func(args)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
try:
|
|
||||||
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
|
|
||||||
|
|
||||||
if re.match(TYPE_PREFIX, os.path.basename(sys.argv[0])):
|
|
||||||
cdist_lib = os.environ["__cdist_python_lib"]
|
|
||||||
sys.path.insert(0, cdist_lib)
|
|
||||||
import cdist.emulator
|
|
||||||
cdist.emulator.emulator(sys.argv)
|
|
||||||
else:
|
|
||||||
cdist_lib = os.path.abspath(os.path.join(os.path.dirname(__file__),
|
|
||||||
'../lib'))
|
|
||||||
sys.path.insert(0, cdist_lib)
|
|
||||||
|
|
||||||
import cdist
|
|
||||||
import cdist.banner
|
|
||||||
import cdist.exec
|
|
||||||
import cdist.path
|
|
||||||
|
|
||||||
commandline()
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
sys.exit(0)
|
|
||||||
except cdist.Error as e:
|
|
||||||
log.error(e)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
|
@ -22,14 +22,13 @@
|
||||||
import argparse
|
import argparse
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
|
|
||||||
import cdist
|
import cdist
|
||||||
import cdist.path
|
import cdist.path
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
def emulator(argv):
|
def run(argv):
|
||||||
"""Emulate type commands (i.e. __file and co)"""
|
"""Emulate type commands (i.e. __file and co)"""
|
||||||
type = os.path.basename(argv[0])
|
type = os.path.basename(argv[0])
|
||||||
type_dir = os.path.join(os.environ['__cdist_type_base_dir'], type)
|
type_dir = os.path.join(os.environ['__cdist_type_base_dir'], type)
|
||||||
|
@ -101,18 +100,22 @@ def emulator(argv):
|
||||||
# Already exists, verify all parameter are the same
|
# Already exists, verify all parameter are the same
|
||||||
if object_exists:
|
if object_exists:
|
||||||
if not os.path.isfile(file):
|
if not os.path.isfile(file):
|
||||||
print("New parameter + " + param + "specified, aborting")
|
raise cdist.Error("New parameter \"" +
|
||||||
print("Source = " + old_object_source + "new =" + object_source)
|
param + "\" specified, aborting\n" +
|
||||||
sys.exit(1)
|
"Source = " +
|
||||||
|
" ".join(old_object_source)
|
||||||
|
+ " new =" + object_source)
|
||||||
else:
|
else:
|
||||||
param_fd = open(file, "r")
|
param_fd = open(file, "r")
|
||||||
value_old = param_fd.readlines()
|
value_old = param_fd.readlines()
|
||||||
param_fd.close()
|
param_fd.close()
|
||||||
|
|
||||||
if(value_old != value):
|
if(value_old != value):
|
||||||
print("Parameter " + param + " differs: " + " ".join(value_old) + " vs. " + value)
|
raise cdist.Error("Parameter + \"" + param +
|
||||||
print("Sources: " + " ".join(old_object_source) + " and " + object_source)
|
"\" differs: " + " ".join(value_old) + " vs. " +
|
||||||
sys.exit(1)
|
value +
|
||||||
|
"\nSource = " + " ".join(old_object_source)
|
||||||
|
+ " new =" + object_source)
|
||||||
else:
|
else:
|
||||||
param_fd = open(file, "w")
|
param_fd = open(file, "w")
|
||||||
param_fd.writelines(value)
|
param_fd.writelines(value)
|
||||||
|
@ -131,5 +134,13 @@ def emulator(argv):
|
||||||
source_fd.writelines(object_source)
|
source_fd.writelines(object_source)
|
||||||
source_fd.close()
|
source_fd.close()
|
||||||
|
|
||||||
# sys.exit(1)
|
|
||||||
print("Finished " + type + "/" + object_id + repr(params))
|
print("Finished " + type + "/" + object_id + repr(params))
|
||||||
|
|
||||||
|
|
||||||
|
def link(exec_path, bin_dir, type_list):
|
||||||
|
"""Link type names to cdist-type-emulator"""
|
||||||
|
source = os.path.abspath(exec_path)
|
||||||
|
for type in type_list:
|
||||||
|
destination = os.path.join(bin_dir, type)
|
||||||
|
log.debug("Linking %s to %s", source, destination)
|
||||||
|
os.symlink(source, destination)
|
||||||
|
|
|
@ -94,7 +94,6 @@ class Path:
|
||||||
# Setup binary directory + contents
|
# Setup binary directory + contents
|
||||||
self.bin_dir = os.path.join(self.out_dir, "bin")
|
self.bin_dir = os.path.join(self.out_dir, "bin")
|
||||||
os.mkdir(self.bin_dir)
|
os.mkdir(self.bin_dir)
|
||||||
self.link_type_to_emulator()
|
|
||||||
|
|
||||||
# List of type explorers transferred
|
# List of type explorers transferred
|
||||||
self.type_explorers_transferred = {}
|
self.type_explorers_transferred = {}
|
||||||
|
@ -275,12 +274,3 @@ class Path:
|
||||||
# Ensure that the path exists
|
# Ensure that the path exists
|
||||||
self.remote_mkdir(remote_base)
|
self.remote_mkdir(remote_base)
|
||||||
self.transfer_dir(src, dst)
|
self.transfer_dir(src, dst)
|
||||||
|
|
||||||
|
|
||||||
def link_type_to_emulator(self):
|
|
||||||
"""Link type names to cdist-type-emulator"""
|
|
||||||
source = os.path.abspath(sys.argv[0])
|
|
||||||
for type in self.list_types():
|
|
||||||
destination = os.path.join(self.bin_dir, type)
|
|
||||||
log.debug("Linking %s to %s", source, destination)
|
|
||||||
os.symlink(source, destination)
|
|
||||||
|
|
18
test.py
18
test.py
|
@ -30,6 +30,9 @@ import unittest
|
||||||
sys.path.insert(0, os.path.abspath(
|
sys.path.insert(0, os.path.abspath(
|
||||||
os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')))
|
os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')))
|
||||||
|
|
||||||
|
cdist_exec_path = os.path.abspath(
|
||||||
|
os.path.join(os.path.dirname(os.path.realpath(__file__)), "bin/cdist"))
|
||||||
|
|
||||||
import cdist
|
import cdist
|
||||||
import cdist.config
|
import cdist.config
|
||||||
import cdist.exec
|
import cdist.exec
|
||||||
|
@ -85,13 +88,14 @@ class Config(unittest.TestCase):
|
||||||
self.temp_dir = tempfile.mkdtemp()
|
self.temp_dir = tempfile.mkdtemp()
|
||||||
self.init_manifest = os.path.join(self.temp_dir, "manifest")
|
self.init_manifest = os.path.join(self.temp_dir, "manifest")
|
||||||
self.config = cdist.config.Config("localhost",
|
self.config = cdist.config.Config("localhost",
|
||||||
initial_manifest=self.init_manifest)
|
initial_manifest=self.init_manifest,
|
||||||
|
exec_path=cdist_exec_path)
|
||||||
|
|
||||||
def test_initial_manifest_different_parameter(self):
|
def test_initial_manifest_different_parameter(self):
|
||||||
manifest_fd = open(self.init_manifest, "w")
|
manifest_fd = open(self.init_manifest, "w")
|
||||||
manifest_fd.writelines(["#!/bin/sh\n",
|
manifest_fd.writelines(["#!/bin/sh\n",
|
||||||
"__file " + self.temp_dir + "--mode 0700\n",
|
"__file " + self.temp_dir + " --mode 0700\n",
|
||||||
"__file " + self.temp_dir + "--mode 0600\n",
|
"__file " + self.temp_dir + " --mode 0600\n",
|
||||||
])
|
])
|
||||||
manifest_fd.close()
|
manifest_fd.close()
|
||||||
|
|
||||||
|
@ -101,7 +105,7 @@ class Config(unittest.TestCase):
|
||||||
manifest_fd = open(self.init_manifest, "w")
|
manifest_fd = open(self.init_manifest, "w")
|
||||||
manifest_fd.writelines(["#!/bin/sh\n",
|
manifest_fd.writelines(["#!/bin/sh\n",
|
||||||
"__file " + self.temp_dir + '\n',
|
"__file " + self.temp_dir + '\n',
|
||||||
"__file " + self.temp_dir + "--mode 0600\n",
|
"__file " + self.temp_dir + " --mode 0600\n",
|
||||||
])
|
])
|
||||||
manifest_fd.close()
|
manifest_fd.close()
|
||||||
|
|
||||||
|
@ -110,7 +114,7 @@ class Config(unittest.TestCase):
|
||||||
def test_initial_manifest_parameter_removed(self):
|
def test_initial_manifest_parameter_removed(self):
|
||||||
manifest_fd = open(self.init_manifest, "w")
|
manifest_fd = open(self.init_manifest, "w")
|
||||||
manifest_fd.writelines(["#!/bin/sh\n",
|
manifest_fd.writelines(["#!/bin/sh\n",
|
||||||
"__file " + self.temp_dir + "--mode 0600\n",
|
"__file " + self.temp_dir + " --mode 0600\n",
|
||||||
"__file " + self.temp_dir + "\n",
|
"__file " + self.temp_dir + "\n",
|
||||||
])
|
])
|
||||||
manifest_fd.close()
|
manifest_fd.close()
|
||||||
|
@ -120,8 +124,8 @@ class Config(unittest.TestCase):
|
||||||
def test_initial_manifest_parameter_twice(self):
|
def test_initial_manifest_parameter_twice(self):
|
||||||
manifest_fd = open(self.init_manifest, "w")
|
manifest_fd = open(self.init_manifest, "w")
|
||||||
manifest_fd.writelines(["#!/bin/sh\n",
|
manifest_fd.writelines(["#!/bin/sh\n",
|
||||||
"__file " + self.temp_dir + "--mode 0600\n",
|
"__file " + self.temp_dir + " --mode 0600\n",
|
||||||
"__file " + self.temp_dir + "--mode 0600\n",
|
"__file " + self.temp_dir + " --mode 0600\n",
|
||||||
])
|
])
|
||||||
manifest_fd.close()
|
manifest_fd.close()
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue