forked from ungleich-public/cdist
140 lines
3.7 KiB
Bash
Executable file
140 lines
3.7 KiB
Bash
Executable file
#!/bin/sh -e
|
|
#
|
|
# 2012 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() {
|
|
# uncomment me for debugging
|
|
#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
|
|
log "exec_prefix: $exec_prefix"
|
|
log "copy_prefix: $copy_prefix"
|
|
log "copy_destination_prefix: $copy_destination_prefix"
|
|
|
|
case "$mode" in
|
|
exec)
|
|
# In exec mode the first argument is the __target_host which we already got from env. Get rid of it.
|
|
shift
|
|
code="$exec_prefix schroot -c $schroot_name -- sh -c '$@'"
|
|
;;
|
|
copy)
|
|
# get directory for given chroot_name
|
|
schroot_directory="$($exec_prefix schroot -c $schroot_name --config | awk -F = '/directory=/ {print $2}')"
|
|
[ -n "$schroot_directory" ] || die "Failed to retreive schroot directory for schroot: $schroot_name"
|
|
log "schroot_directory: $schroot_directory"
|
|
# 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 "-----"
|