Merge branch 'master' into autorequire
Conflicts: lib/cdist/test/emulator/__init__.py Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch>
This commit is contained in:
commit
f36d09289d
17 changed files with 445 additions and 21 deletions
|
@ -24,7 +24,7 @@
|
||||||
if [ -f "$__object/parameter/name" ]; then
|
if [ -f "$__object/parameter/name" ]; then
|
||||||
name="$(cat "$__object/parameter/name")"
|
name="$(cat "$__object/parameter/name")"
|
||||||
else
|
else
|
||||||
name="/$__object_id"
|
name="$__object_id"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
pgrep -x -f "$name" || true
|
pgrep -x -f "$name" || true
|
||||||
|
|
|
@ -50,6 +50,10 @@ __process /usr/sbin/sshd --state stopped --stop "/etc/rc.d/sshd stop"
|
||||||
# Ensure cups is running, which runs with -C ...:
|
# Ensure cups is running, which runs with -C ...:
|
||||||
__process cups --start "/etc/rc.d/cups start" --state running \
|
__process cups --start "/etc/rc.d/cups start" --state running \
|
||||||
--name "/usr/sbin/cupsd -C /etc/cups/cupsd.conf"
|
--name "/usr/sbin/cupsd -C /etc/cups/cupsd.conf"
|
||||||
|
|
||||||
|
# Ensure rpc.statd is running (which usually runs with -L) using a regexp
|
||||||
|
__process rpcstatd --state running --start "/etc/init.d/statd start" \
|
||||||
|
--name "rpc.statd.*"
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
* Cleanup: __object_fq variable removed (never used)
|
* Cleanup: __object_fq variable removed (never used)
|
||||||
* Cleanup: Environment variable __self DEPRECATED, use __object_name instead
|
* Cleanup: Environment variable __self DEPRECATED, use __object_name instead
|
||||||
* Cleanup: Environment variable __self scheduled for removal in cdist 2.1
|
* Cleanup: Environment variable __self scheduled for removal in cdist 2.1
|
||||||
|
* New Type: __cron (Steven Armstrong)
|
||||||
|
|
||||||
2.0.3: 2011-10-18
|
2.0.3: 2011-10-18
|
||||||
* Improved logging, added --verbose, by more quiet by default
|
* Improved logging, added --verbose, by more quiet by default
|
||||||
|
|
|
@ -71,7 +71,7 @@ class ConfigInstall(object):
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
self.deploy_to()
|
self.deploy_to()
|
||||||
self.cleanup()
|
self.cleanup()
|
||||||
self.log.info("Finished run in %s seconds",
|
self.log.info("Finished successful run in %s seconds",
|
||||||
time.time() - start_time)
|
time.time() - start_time)
|
||||||
|
|
||||||
def stage_prepare(self):
|
def stage_prepare(self):
|
||||||
|
@ -106,7 +106,7 @@ class ConfigInstall(object):
|
||||||
"""Run gencode and code for an object"""
|
"""Run gencode and code for an object"""
|
||||||
self.log.debug("Trying to run object " + cdist_object.name)
|
self.log.debug("Trying to run object " + cdist_object.name)
|
||||||
if cdist_object.state == core.Object.STATE_RUNNING:
|
if cdist_object.state == core.Object.STATE_RUNNING:
|
||||||
# FIXME: resolve dependency circle
|
# FIXME: resolve dependency circle / show problem source
|
||||||
raise cdist.Error("Detected circular dependency in " + cdist_object.name)
|
raise cdist.Error("Detected circular dependency in " + cdist_object.name)
|
||||||
elif cdist_object.state == core.Object.STATE_DONE:
|
elif cdist_object.state == core.Object.STATE_DONE:
|
||||||
self.log.debug("Ignoring run of already finished object %s", cdist_object)
|
self.log.debug("Ignoring run of already finished object %s", cdist_object)
|
||||||
|
@ -119,6 +119,13 @@ class ConfigInstall(object):
|
||||||
for requirement in cdist_object.requirements:
|
for requirement in cdist_object.requirements:
|
||||||
self.log.debug("Object %s requires %s", cdist_object, requirement)
|
self.log.debug("Object %s requires %s", cdist_object, requirement)
|
||||||
required_object = cdist_object.object_from_name(requirement)
|
required_object = cdist_object.object_from_name(requirement)
|
||||||
|
|
||||||
|
# The user may have created dependencies without satisfying them
|
||||||
|
if not required_object.exists:
|
||||||
|
raise cdist.Error(cdist_object.name + " requires non-existing " + required_object.name)
|
||||||
|
else:
|
||||||
|
self.log.debug("Required object %s exists", required_object.name)
|
||||||
|
|
||||||
self.object_run(required_object)
|
self.object_run(required_object)
|
||||||
|
|
||||||
# Generate
|
# Generate
|
||||||
|
|
|
@ -23,6 +23,7 @@ from cdist.core.type import Type
|
||||||
from cdist.core.type import NoSuchTypeError
|
from cdist.core.type import NoSuchTypeError
|
||||||
from cdist.core.object import Object
|
from cdist.core.object import Object
|
||||||
from cdist.core.object import IllegalObjectIdError
|
from cdist.core.object import IllegalObjectIdError
|
||||||
|
from cdist.core.object import OBJECT_MARKER
|
||||||
from cdist.core.explorer import Explorer
|
from cdist.core.explorer import Explorer
|
||||||
from cdist.core.manifest import Manifest
|
from cdist.core.manifest import Manifest
|
||||||
from cdist.core.code import Code
|
from cdist.core.code import Code
|
||||||
|
|
|
@ -30,7 +30,7 @@ from cdist.util import fsproperty
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
DOT_CDIST = '.cdist'
|
OBJECT_MARKER = '.cdist'
|
||||||
|
|
||||||
|
|
||||||
class IllegalObjectIdError(cdist.Error):
|
class IllegalObjectIdError(cdist.Error):
|
||||||
|
@ -72,7 +72,7 @@ class Object(object):
|
||||||
def list_object_names(cls, object_base_path):
|
def list_object_names(cls, object_base_path):
|
||||||
"""Return a list of object names"""
|
"""Return a list of object names"""
|
||||||
for path, dirs, files in os.walk(object_base_path):
|
for path, dirs, files in os.walk(object_base_path):
|
||||||
if DOT_CDIST in dirs:
|
if OBJECT_MARKER in dirs:
|
||||||
yield os.path.relpath(path, object_base_path)
|
yield os.path.relpath(path, object_base_path)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
|
@ -100,13 +100,13 @@ class Object(object):
|
||||||
if object_id:
|
if object_id:
|
||||||
if object_id.startswith('/'):
|
if object_id.startswith('/'):
|
||||||
raise IllegalObjectIdError(object_id, 'object_id may not start with /')
|
raise IllegalObjectIdError(object_id, 'object_id may not start with /')
|
||||||
if '.cdist' in object_id:
|
if OBJECT_MARKER in object_id.split(os.sep):
|
||||||
raise IllegalObjectIdError(object_id, 'object_id may not contain \'.cdist\'')
|
raise IllegalObjectIdError(object_id, 'object_id may not contain \'%s\'' % OBJECT_MARKER)
|
||||||
self.type = cdist_type # instance of Type
|
self.type = cdist_type # instance of Type
|
||||||
self.base_path = base_path
|
self.base_path = base_path
|
||||||
self.object_id = object_id
|
self.object_id = object_id
|
||||||
self.name = self.join_name(self.type.name, self.object_id)
|
self.name = self.join_name(self.type.name, self.object_id)
|
||||||
self.path = os.path.join(self.type.path, self.object_id, DOT_CDIST)
|
self.path = os.path.join(self.type.path, self.object_id, OBJECT_MARKER)
|
||||||
self.absolute_path = os.path.join(self.base_path, self.path)
|
self.absolute_path = os.path.join(self.base_path, self.path)
|
||||||
self.code_local_path = os.path.join(self.path, "code-local")
|
self.code_local_path = os.path.join(self.path, "code-local")
|
||||||
self.code_remote_path = os.path.join(self.path, "code-remote")
|
self.code_remote_path = os.path.join(self.path, "code-remote")
|
||||||
|
@ -132,9 +132,9 @@ class Object(object):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
type_path = self.type.base_path
|
type_path = self.type.base_path
|
||||||
object_path = self.base_path
|
base_path = self.base_path
|
||||||
type_name, object_id = self.split_name(object_name)
|
type_name, object_id = self.split_name(object_name)
|
||||||
return self.__class__(self.type.__class__(type_path, type_name), object_path, object_id=object_id)
|
return self.__class__(self.type.__class__(type_path, type_name), base_path, object_id=object_id)
|
||||||
|
|
||||||
# FIXME: still needed?
|
# FIXME: still needed?
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -157,19 +157,22 @@ class Emulator(object):
|
||||||
self.log.debug("Recording requirement: " + requirement)
|
self.log.debug("Recording requirement: " + requirement)
|
||||||
requirement_parts = requirement.split(os.sep, 1)
|
requirement_parts = requirement.split(os.sep, 1)
|
||||||
requirement_type_name = requirement_parts[0]
|
requirement_type_name = requirement_parts[0]
|
||||||
requirement_object_id = requirement_parts[1]
|
try:
|
||||||
|
requirement_object_id = requirement_parts[1]
|
||||||
|
except IndexError:
|
||||||
|
# no object id, assume singleton
|
||||||
|
requirement_object_id = 'singleton'
|
||||||
|
|
||||||
# FIXME: Add support for omitted object id == singleton
|
# Remove leading / from object id
|
||||||
#if len(requirement_parts) == 1:
|
|
||||||
#except IndexError:
|
|
||||||
# # no object id, must be singleton
|
|
||||||
# requirement_object_id = 'singleton'
|
|
||||||
|
|
||||||
# Remove / if existent in object id
|
|
||||||
requirement_object_id = requirement_object_id.lstrip('/')
|
requirement_object_id = requirement_object_id.lstrip('/')
|
||||||
|
|
||||||
# Instantiate type which fails if type does not exist
|
# Instantiate type which fails if type does not exist
|
||||||
requirement_type = core.Type(self.type_base_path, requirement_type_name)
|
requirement_type = core.Type(self.type_base_path, requirement_type_name)
|
||||||
|
|
||||||
|
if requirement_object_id == 'singleton' \
|
||||||
|
and not requirement_type.is_singleton:
|
||||||
|
raise IllegalRequirementError(requirement, "Missing object_id and type is not a singleton.")
|
||||||
|
|
||||||
# Instantiate object which fails if the object_id is illegal
|
# Instantiate object which fails if the object_id is illegal
|
||||||
requirement_object = core.Object(requirement_type, self.object_base_path, requirement_object_id)
|
requirement_object = core.Object(requirement_type, self.object_base_path, requirement_object_id)
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,21 @@ class EmulatorTestCase(test.CdistTestCase):
|
||||||
emu = emulator.Emulator(argv)
|
emu = emulator.Emulator(argv)
|
||||||
self.assertRaises(core.IllegalObjectIdError, emu.run)
|
self.assertRaises(core.IllegalObjectIdError, emu.run)
|
||||||
|
|
||||||
|
def test_missing_object_id_requirement(self):
|
||||||
|
argv = ['__file', '/tmp/foobar']
|
||||||
|
os.environ.update(self.env)
|
||||||
|
os.environ['require'] = '__file'
|
||||||
|
emu = emulator.Emulator(argv)
|
||||||
|
self.assertRaises(emulator.IllegalRequirementError, emu.run)
|
||||||
|
|
||||||
|
def test_singleton_object_requirement(self):
|
||||||
|
argv = ['__file', '/tmp/foobar']
|
||||||
|
os.environ.update(self.env)
|
||||||
|
os.environ['require'] = '__issue'
|
||||||
|
emu = emulator.Emulator(argv)
|
||||||
|
emu.run()
|
||||||
|
# if we get here all is fine
|
||||||
|
|
||||||
|
|
||||||
import os.path as op
|
import os.path as op
|
||||||
my_dir = op.abspath(op.dirname(__file__))
|
my_dir = op.abspath(op.dirname(__file__))
|
||||||
|
|
|
@ -58,12 +58,18 @@ class ObjectIdTestCase(test.CdistTestCase):
|
||||||
with self.assertRaises(core.IllegalObjectIdError):
|
with self.assertRaises(core.IllegalObjectIdError):
|
||||||
core.Object(cdist_type, object_base_path, illegal_object_id)
|
core.Object(cdist_type, object_base_path, illegal_object_id)
|
||||||
|
|
||||||
def test_object_id_contains_dotcdist(self):
|
def test_object_id_contains_object_marker(self):
|
||||||
cdist_type = core.Type(type_base_path, '__third')
|
cdist_type = core.Type(type_base_path, '__third')
|
||||||
illegal_object_id = 'object_id/may/not/contain/.cdist/anywhere'
|
illegal_object_id = 'object_id/may/not/contain/%s/anywhere' % core.OBJECT_MARKER
|
||||||
with self.assertRaises(core.IllegalObjectIdError):
|
with self.assertRaises(core.IllegalObjectIdError):
|
||||||
core.Object(cdist_type, object_base_path, illegal_object_id)
|
core.Object(cdist_type, object_base_path, illegal_object_id)
|
||||||
|
|
||||||
|
def test_object_id_contains_object_marker_string(self):
|
||||||
|
cdist_type = core.Type(type_base_path, '__third')
|
||||||
|
illegal_object_id = 'object_id/may/contain_%s_in_filename' % core.OBJECT_MARKER
|
||||||
|
core.Object(cdist_type, object_base_path, illegal_object_id)
|
||||||
|
# if we get here, the test passed
|
||||||
|
|
||||||
|
|
||||||
class ObjectTestCase(test.CdistTestCase):
|
class ObjectTestCase(test.CdistTestCase):
|
||||||
|
|
||||||
|
|
2
other/examples/remote/README
Normal file
2
other/examples/remote/README
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Some examples of using alternative __remote_copy and __remote_exec prefixes.
|
||||||
|
This allows you to change how cdist interacts with the target host (or directory, or whatever :-)
|
47
other/examples/remote/chroot/copy
Executable file
47
other/examples/remote/chroot/copy
Executable file
|
@ -0,0 +1,47 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||||
|
#
|
||||||
|
# This file is part of cdist.
|
||||||
|
#
|
||||||
|
# cdist is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# cdist is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# __remote_copy script to run cdist against a local chroot instead of via ssh
|
||||||
|
# to a remote target host.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# __remote_copy="/path/to/this/script /path/to/your/chroot" cdist config target-id
|
||||||
|
#
|
||||||
|
|
||||||
|
log() {
|
||||||
|
#echo "$@" | logger -t "cdist-chroot-copy"
|
||||||
|
:
|
||||||
|
}
|
||||||
|
|
||||||
|
chroot="$1"; shift
|
||||||
|
target_host="$__target_host"
|
||||||
|
|
||||||
|
# replace target_host with chroot location
|
||||||
|
code="$(echo "$@" | sed "s|$target_host:|$chroot|g")"
|
||||||
|
|
||||||
|
log "target_host: $target_host"
|
||||||
|
log "chroot: $chroot"
|
||||||
|
log "$@"
|
||||||
|
log "$code"
|
||||||
|
|
||||||
|
# copy files into chroot
|
||||||
|
cp $code
|
||||||
|
|
||||||
|
log "-----"
|
55
other/examples/remote/chroot/exec
Executable file
55
other/examples/remote/chroot/exec
Executable file
|
@ -0,0 +1,55 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||||
|
#
|
||||||
|
# This file is part of cdist.
|
||||||
|
#
|
||||||
|
# cdist is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# cdist is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# __remote_exec script to run cdist against a local chroot instead of via ssh
|
||||||
|
# on a remote target host.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# __remote_exec="/path/to/this/script /path/to/your/chroot" cdist config target-id
|
||||||
|
#
|
||||||
|
|
||||||
|
log() {
|
||||||
|
#echo "$@" | logger -t "cdist-chroot-exec"
|
||||||
|
:
|
||||||
|
}
|
||||||
|
|
||||||
|
chroot="$1"; shift
|
||||||
|
target_host="$1"; shift
|
||||||
|
|
||||||
|
script=$(mktemp "${chroot}/tmp/chroot-${0##*/}.XXXXXXXXXX")
|
||||||
|
trap cleanup INT TERM EXIT
|
||||||
|
cleanup() {
|
||||||
|
[ $__cdist_debug ] || rm "$script"
|
||||||
|
}
|
||||||
|
|
||||||
|
log "target_host: $target_host"
|
||||||
|
log "script: $script"
|
||||||
|
log "@: $@"
|
||||||
|
echo "#!/bin/sh -l" > "$script"
|
||||||
|
echo "$@" >> "$script"
|
||||||
|
chmod +x "$script"
|
||||||
|
|
||||||
|
relative_script="${script#$chroot}"
|
||||||
|
log "relative_script: $relative_script"
|
||||||
|
|
||||||
|
# run in chroot
|
||||||
|
chroot "$chroot" "$relative_script"
|
||||||
|
|
||||||
|
log "-----"
|
132
other/examples/remote/schroot-uri
Executable file
132
other/examples/remote/schroot-uri
Executable file
|
@ -0,0 +1,132 @@
|
||||||
|
#!/bin/sh -e
|
||||||
|
#
|
||||||
|
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||||
|
#
|
||||||
|
# This file is part of cdist.
|
||||||
|
#
|
||||||
|
# cdist is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# cdist is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# __remote_{exec,copy} script to run cdist against a schroot target uri
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# __remote_exec="/path/to/this/script exec" cdist config target_uri
|
||||||
|
# __remote_copy="/path/to/this/script copy" cdist config target_uri
|
||||||
|
#
|
||||||
|
# # target_uri examples:
|
||||||
|
# schroot:///chroot-name
|
||||||
|
# schroot://foo.ethz.ch/chroot-name
|
||||||
|
# schroot://user-name@foo.ethz.ch/chroot-name
|
||||||
|
#
|
||||||
|
# # and how to match them in .../manifest/init
|
||||||
|
# case "$target_host" in
|
||||||
|
# schroot://*)
|
||||||
|
# # any schroot
|
||||||
|
# ;;
|
||||||
|
# schroot://foo.ethz.ch/*)
|
||||||
|
# # any schroot on specific host
|
||||||
|
# ;;
|
||||||
|
# schroot://foo.ethz.ch/chroot-name)
|
||||||
|
# # specific schroot on specific host
|
||||||
|
# ;;
|
||||||
|
# schroot:///chroot-name)
|
||||||
|
# # specific schroot on localhost
|
||||||
|
# ;;
|
||||||
|
# esac
|
||||||
|
|
||||||
|
my_name="${0##*/}"
|
||||||
|
mode="$1"; shift
|
||||||
|
|
||||||
|
log() {
|
||||||
|
#echo "$@" | logger -t "cdist-$my_name-$mode"
|
||||||
|
:
|
||||||
|
}
|
||||||
|
|
||||||
|
die() {
|
||||||
|
echo "$@" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uri="$__target_host"
|
||||||
|
|
||||||
|
scheme="${uri%%:*}"; rest="${uri#$scheme:}"; rest="${rest#//}"
|
||||||
|
authority="${rest%%/*}"; rest="${rest#$authority}"
|
||||||
|
path="${rest%\?*}"; rest="${rest#$path}"
|
||||||
|
schroot_name="${path#/}"
|
||||||
|
|
||||||
|
[ "$scheme" = "schroot" ] || die "Failed to parse scheme from __target_host ($__target_host). Expected 'schroot', got '$scheme'"
|
||||||
|
[ -n "$schroot_name" ] || die "Failed to parse schroot name from __target_host: $__target_host"
|
||||||
|
|
||||||
|
case "$authority" in
|
||||||
|
'')
|
||||||
|
# authority is empty, neither user nor host given
|
||||||
|
user=""
|
||||||
|
host=""
|
||||||
|
;;
|
||||||
|
*@*)
|
||||||
|
# authority contains @, take user from authority
|
||||||
|
user="${authority%@*}"
|
||||||
|
host="${authority#*@}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
# no user in authority, default to root
|
||||||
|
user="root"
|
||||||
|
host="$authority"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
log "mode: $mode"
|
||||||
|
log "@: $@"
|
||||||
|
log "uri: $uri"
|
||||||
|
log "scheme: $scheme"
|
||||||
|
log "authority: $authority"
|
||||||
|
log "user: $user"
|
||||||
|
log "host: $host"
|
||||||
|
log "path: $path"
|
||||||
|
log "schroot_name: $schroot_name"
|
||||||
|
|
||||||
|
exec_prefix=""
|
||||||
|
copy_prefix=""
|
||||||
|
if [ -n "$host" ]; then
|
||||||
|
# we are working on a remote host
|
||||||
|
exec_prefix="ssh -o User=$user -q $host"
|
||||||
|
copy_prefix="scp -o User=$user -q"
|
||||||
|
copy_destination_prefix="$host:"
|
||||||
|
else
|
||||||
|
# working on local machine
|
||||||
|
copy_prefix="cp"
|
||||||
|
copy_destination_prefix=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
case "$mode" in
|
||||||
|
exec)
|
||||||
|
code="$exec_prefix schroot -c $schroot_name -- $@"
|
||||||
|
;;
|
||||||
|
copy)
|
||||||
|
# get directory for given chroot_name
|
||||||
|
schroot_directory="$($exec_prefix schroot $chroot_name --config | awk -F = '/directory=/ {print $2}')"
|
||||||
|
[ -n "$schroot_directory" ] || die "Failed to retreive schroot directory for schroot: $schroot_name"
|
||||||
|
# prefix destination with chroot
|
||||||
|
code="$copy_prefix $(echo "$@" | sed "s|$uri:|${copy_destination_prefix}${schroot_directory}|g")"
|
||||||
|
;;
|
||||||
|
*) die "Unknown mode: $mode";;
|
||||||
|
esac
|
||||||
|
|
||||||
|
log "code: $code"
|
||||||
|
|
||||||
|
# Run the code
|
||||||
|
$code
|
||||||
|
|
||||||
|
log "-----"
|
50
other/examples/remote/schroot/copy
Executable file
50
other/examples/remote/schroot/copy
Executable file
|
@ -0,0 +1,50 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||||
|
#
|
||||||
|
# This file is part of cdist.
|
||||||
|
#
|
||||||
|
# cdist is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# cdist is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# __remote_copy script to run cdist against a chroot on the target host over ssh.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# __remote_copy="/path/to/this/script schroot-chroot-name" cdist config target_host
|
||||||
|
#
|
||||||
|
|
||||||
|
log() {
|
||||||
|
#echo "$@" | logger -t "cdist-schroot-copy"
|
||||||
|
:
|
||||||
|
}
|
||||||
|
|
||||||
|
chroot_name="$1"; shift
|
||||||
|
target_host="$__target_host"
|
||||||
|
|
||||||
|
# get directory for given chroot_name
|
||||||
|
chroot="$(ssh -o User=root -q $target_host schroot $chroot_name --config | awk -F = '/directory=/ {print $2}')"
|
||||||
|
|
||||||
|
# prefix destination with chroot
|
||||||
|
code="$(echo "$@" | sed "s|$target_host:|$target_host:$chroot|g")"
|
||||||
|
|
||||||
|
log "target_host: $target_host"
|
||||||
|
log "chroot_name: $chroot_name"
|
||||||
|
log "chroot: $chroot"
|
||||||
|
log "@: $@"
|
||||||
|
log "code: $code"
|
||||||
|
|
||||||
|
# copy files into remote chroot
|
||||||
|
scp -o User=root -q $code
|
||||||
|
|
||||||
|
log "-----"
|
45
other/examples/remote/schroot/exec
Executable file
45
other/examples/remote/schroot/exec
Executable file
|
@ -0,0 +1,45 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||||
|
#
|
||||||
|
# This file is part of cdist.
|
||||||
|
#
|
||||||
|
# cdist is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# cdist is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# __remote_exec script to run cdist against a chroot on the target host over ssh.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# __remote_exec="/path/to/this/script schroot-chroot-name" cdist config target_host
|
||||||
|
#
|
||||||
|
|
||||||
|
log() {
|
||||||
|
#echo "$@" | logger -t "cdist-schroot-exec"
|
||||||
|
:
|
||||||
|
}
|
||||||
|
|
||||||
|
chroot_name="$1"; shift
|
||||||
|
target_host="$1"; shift
|
||||||
|
|
||||||
|
code="ssh -o User=root -q $target_host schroot -c $chroot_name -- $@"
|
||||||
|
|
||||||
|
log "target_host: $target_host"
|
||||||
|
log "chroot_name: $chroot_name"
|
||||||
|
log "@: $@"
|
||||||
|
log "code: $code"
|
||||||
|
|
||||||
|
# run in remote chroot
|
||||||
|
$code
|
||||||
|
|
||||||
|
log "-----"
|
28
other/examples/remote/ssh/copy
Executable file
28
other/examples/remote/ssh/copy
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||||
|
#
|
||||||
|
# This file is part of cdist.
|
||||||
|
#
|
||||||
|
# cdist is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# cdist is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# same as cdist default
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# __remote_copy="/path/to/this/script" cdist config target_host
|
||||||
|
#
|
||||||
|
|
||||||
|
#echo "$@" | logger -t "cdist-ssh-copy"
|
||||||
|
scp -o User=root -q $@
|
28
other/examples/remote/ssh/exec
Executable file
28
other/examples/remote/ssh/exec
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# 2011 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||||
|
#
|
||||||
|
# This file is part of cdist.
|
||||||
|
#
|
||||||
|
# cdist is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# cdist is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# same as cdist default
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# __remote_exec="/path/to/this/script" cdist config target_host
|
||||||
|
#
|
||||||
|
|
||||||
|
#echo "$@" | logger -t "cdist-ssh-exec"
|
||||||
|
ssh -o User=root -q $@
|
Loading…
Reference in a new issue