forked from ungleich-public/cdist
commit
4f189eb804
9 changed files with 92 additions and 8 deletions
|
@ -66,8 +66,15 @@ destination_upload="\$($__remote_exec $__target_host "mktemp $tempfile_template"
|
|||
DONE
|
||||
if [ "$upload_file" ]; then
|
||||
echo upload >> "$__messages_out"
|
||||
# IPv6 fix
|
||||
if $(echo "${__target_host}" | grep -q -E '^[0-9a-fA-F:]+$')
|
||||
then
|
||||
my_target_host="[${__target_host}]"
|
||||
else
|
||||
my_target_host="${__target_host}"
|
||||
fi
|
||||
cat << DONE
|
||||
$__remote_copy "$source" "${__target_host}:\$destination_upload"
|
||||
$__remote_copy "$source" "${my_target_host}:\$destination_upload"
|
||||
DONE
|
||||
fi
|
||||
# move uploaded file into place
|
||||
|
|
|
@ -43,7 +43,14 @@ basepresent="$(cat "$__object/explorer/basepresent")"
|
|||
|
||||
if [ "$state" = "present" ]; then
|
||||
if [ "$basepresent" = "NONE" ]; then
|
||||
echo "$__remote_copy" "${jailbase}" "$__target_host:${remotebase}"
|
||||
# IPv6 fix
|
||||
if $(echo "${__target_host}" | grep -q -E '^[0-9a-fA-F:]+$')
|
||||
then
|
||||
my_target_host="[${__target_host}]"
|
||||
else
|
||||
my_target_host="${__target_host}"
|
||||
fi
|
||||
echo "$__remote_copy" "${jailbase}" "${my_target_host}:${remotebase}"
|
||||
fi # basepresent=NONE
|
||||
fi # state=present
|
||||
|
||||
|
|
|
@ -39,7 +39,14 @@ basepresent="$(cat "$__object/explorer/basepresent")"
|
|||
|
||||
if [ "$state" = "present" ]; then
|
||||
if [ "$basepresent" = "NONE" ]; then
|
||||
echo "$__remote_copy" "${jailbase}" "$__target_host:${remotebase}"
|
||||
# IPv6 fix
|
||||
if $(echo "${__target_host}" | grep -q -E '^[0-9a-fA-F:]+$')
|
||||
then
|
||||
my_target_host="[${__target_host}]"
|
||||
else
|
||||
my_target_host="${__target_host}"
|
||||
fi
|
||||
echo "$__remote_copy" "${jailbase}" "${my_target_host}:${remotebase}"
|
||||
fi # basepresent=NONE
|
||||
fi # state=present
|
||||
|
||||
|
|
|
@ -59,12 +59,20 @@ case $uname in
|
|||
;;
|
||||
esac
|
||||
|
||||
# IPv6 fix
|
||||
if $(echo "${__target_host}" | grep -q -E '^[0-9a-fA-F:]+$')
|
||||
then
|
||||
my_target_host="[${__target_host}]"
|
||||
else
|
||||
my_target_host="${__target_host}"
|
||||
fi
|
||||
|
||||
if [ -n "${cksum}" ]; then
|
||||
if [ ! "\${currentSum}" = "${cksum}" ]; then
|
||||
$__remote_copy "${source}" "$__target_host:${rcvar}.new"
|
||||
$__remote_copy "${source}" "${my_target_host}:${rcvar}.new"
|
||||
fi
|
||||
else # File just doesn't exist yet
|
||||
$__remote_copy "${source}" "$__target_host:${rcvar}.new"
|
||||
$__remote_copy "${source}" "${my_target_host}:${rcvar}.new"
|
||||
fi
|
||||
EOF
|
||||
|
||||
|
|
|
@ -32,6 +32,43 @@ import cdist
|
|||
import cdist.exec.util as exec_util
|
||||
|
||||
|
||||
# check whether addr is IPv6
|
||||
try:
|
||||
# python 3.3+
|
||||
import ipaddress
|
||||
|
||||
def _is_ipv6(addr):
|
||||
try:
|
||||
return ipaddress.ip_address(addr).version == 6
|
||||
except ValueError:
|
||||
return False
|
||||
except ImportError:
|
||||
# fallback for older python versions
|
||||
import socket
|
||||
|
||||
def _is_ipv6(addr):
|
||||
try:
|
||||
socket.inet_aton(addr)
|
||||
return False
|
||||
except socket.error:
|
||||
pass
|
||||
try:
|
||||
socket.inet_pton(socket.AF_INET6, addr)
|
||||
return True
|
||||
except socket.error:
|
||||
pass
|
||||
return False
|
||||
|
||||
|
||||
def _wrap_addr(addr):
|
||||
"""If addr is IPv6 then return addr wrapped between '[' and ']',
|
||||
otherwise return it intact."""
|
||||
if _is_ipv6(addr):
|
||||
return "".join(("[", addr, "]", ))
|
||||
else:
|
||||
return addr
|
||||
|
||||
|
||||
class DecodeError(cdist.Error):
|
||||
def __init__(self, command):
|
||||
self.command = command
|
||||
|
@ -118,12 +155,12 @@ class Remote(object):
|
|||
command = self._copy.split()
|
||||
path = os.path.join(source, f)
|
||||
command.extend([path, '{0}:{1}'.format(
|
||||
self.target_host[0], destination)])
|
||||
_wrap_addr(self.target_host[0]), destination)])
|
||||
self._run_command(command)
|
||||
else:
|
||||
command = self._copy.split()
|
||||
command.extend([source, '{0}:{1}'.format(
|
||||
self.target_host[0], destination)])
|
||||
_wrap_addr(self.target_host[0]), destination)])
|
||||
self._run_command(command)
|
||||
|
||||
def transfer_dir_parallel(self, source, destination, jobs):
|
||||
|
@ -145,7 +182,7 @@ class Remote(object):
|
|||
command = self._copy.split()
|
||||
path = os.path.join(source, f)
|
||||
command.extend([path, '{0}:{1}'.format(
|
||||
self.target_host[0], destination)])
|
||||
_wrap_addr(self.target_host[0]), destination)])
|
||||
commands.append(command)
|
||||
results = [
|
||||
pool.apply_async(self._run_command, (cmd,))
|
||||
|
|
|
@ -2,6 +2,7 @@ Changelog
|
|||
---------
|
||||
|
||||
next:
|
||||
* Core, types: support IPv6 (Darko Poljak)
|
||||
* Type __consul: add source and cksum files for Consul 0.7.0 and 0.7.1 (Carlos Ortigoza)
|
||||
* Type __user: FreeBSD fix (Kamila Součková)
|
||||
* New type: __apt_mark (Ander Punnar)
|
||||
|
|
|
@ -17,6 +17,11 @@ passing them to cdist with the --remote-exec and/or --remote-copy arguments.
|
|||
|
||||
For __remote_exec, the custom implementation must behave as if it where ssh.
|
||||
For __remote_copy, it must behave like scp.
|
||||
Please notice, custom implementations should work like ssh/scp so __remote_copy
|
||||
must support IPv6 addresses enclosed in square brackets. For __remote_exec you
|
||||
must take into account that for some options (like -L) IPv6 addresses can be
|
||||
specified by enclosed in square brackets (see :strong:`ssh`\ (1) and
|
||||
:strong:`scp`\ (1)).
|
||||
|
||||
With this simple interface the user can take total control of how cdist
|
||||
interacts with the target when required, while the default implementation
|
||||
|
|
|
@ -251,6 +251,12 @@ script, you can write to stderr:
|
|||
# Output to be saved by cdist for execution on the target
|
||||
echo "touch /etc/cdist-configured"
|
||||
|
||||
Notice: if you use __remote_copy or __remote_exec directly in your scripts
|
||||
then for IPv6 address with __remote_copy execution you should enclose IPv6
|
||||
address in square brackets. The same applies to __remote_exec if it behaves
|
||||
the same as ssh for some options where colon is a delimiter, as for -L ssh
|
||||
option (see :strong:`ssh`\ (1) and :strong:`scp`\ (1)).
|
||||
|
||||
|
||||
Variable access from the generated scripts
|
||||
------------------------------------------
|
||||
|
|
|
@ -157,6 +157,12 @@ cdist/conf
|
|||
The distribution configuration directory. It contains official types and
|
||||
explorers. This path is relative to cdist installation directory.
|
||||
|
||||
NOTES
|
||||
-----
|
||||
cdist detects if host is specified by IPv6 address. If so then remote_copy
|
||||
command is executed with host address enclosed in square brackets
|
||||
(see :strong:`scp`\ (1)).
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
|
||||
|
|
Loading…
Reference in a new issue