@ -32,7 +32,7 @@ from ansible import constants as C
from ansible . errors import AnsibleError , AnsibleConnectionFailure , AnsibleFileNotFound
from ansible . plugins . connection import ConnectionBase
from ansible . utils . path import unfrackpath , makedirs_safe
from ansible . utils . unicode import to_bytes , to_unicode
from ansible . utils . unicode import to_bytes , to_unicode , to_str
from ansible . compat . six import text_type , binary_type
try :
@ -197,7 +197,7 @@ class Connection(ConnectionBase):
if user :
self . _add_args (
" ANSIBLE_REMOTE_USER/remote_user/ansible_user/user/-u set " ,
( " -o " , " User= {0} " . format ( self . _play_context . remote_user ) )
( " -o " , " User= {0} " . format ( to_bytes ( self . _play_context . remote_user ) ) )
)
self . _add_args (
@ -231,7 +231,7 @@ class Connection(ConnectionBase):
raise AnsibleError ( " Cannot write to ControlPath %s " % cpdir )
args = ( " -o " , " ControlPath= {0} " . format (
C. ANSIBLE_SSH_CONTROL_PATH % dict ( directory = cpdir ) )
to_bytes( C. ANSIBLE_SSH_CONTROL_PATH % dict ( directory = cpdir ) ) )
)
self . _add_args ( " found only ControlPersist; added ControlPath " , args )
@ -320,7 +320,7 @@ class Connection(ConnectionBase):
Starts the command and communicates with it until it ends .
'''
display_cmd = map ( pipes. quote , cmd )
display_cmd = map ( to_unicode, map ( pipes. quote , cmd ) )
display . vvv ( u ' SSH: EXEC {0} ' . format ( u ' ' . join ( display_cmd ) ) , host = self . host )
# Start the given command. If we don't need to pipeline data, we can try
@ -354,7 +354,7 @@ class Connection(ConnectionBase):
if self . _play_context . password :
os . close ( self . sshpass_pipe [ 0 ] )
os . write ( self . sshpass_pipe [ 1 ] , " {0} \n " . format ( self . _play_context . password ) )
os . write ( self . sshpass_pipe [ 1 ] , " {0} \n " . format ( to_bytes ( self . _play_context . password ) ) )
os . close ( self . sshpass_pipe [ 1 ] )
## SSH state machine
@ -562,7 +562,7 @@ class Connection(ConnectionBase):
super ( Connection , self ) . exec_command ( cmd , in_data = in_data , sudoable = sudoable )
display . vvv ( " ESTABLISH SSH CONNECTION FOR USER: {0} " . format ( self . _play_context . remote_user ) , host = self . _play_context . remote_addr )
display . vvv ( u " ESTABLISH SSH CONNECTION FOR USER: {0} " . format ( self . _play_context . remote_user ) , host = self . _play_context . remote_addr )
# we can only use tty when we are not pipelining the modules. piping
# data into /usr/bin/python inside a tty automatically invokes the
@ -630,44 +630,46 @@ class Connection(ConnectionBase):
super ( Connection , self ) . put_file ( in_path , out_path )
display . vvv ( " PUT {0} TO {1} " . format ( in_path , out_path ) , host = self . host )
display . vvv ( u " PUT {0} TO {1} " . format ( in_path , out_path ) , host = self . host )
if not os . path . exists ( in_path ) :
raise AnsibleFileNotFound ( " file or module does not exist: {0} " . format ( in_path) )
raise AnsibleFileNotFound ( " file or module does not exist: {0} " . format ( to_str( in_path) ) )
# scp and sftp require square brackets for IPv6 addresses, but
# accept them for hostnames and IPv4 addresses too.
host = ' [ %s ] ' % self . host
if C . DEFAULT_SCP_IF_SSH :
cmd = self . _build_command ( ' scp ' , in_path , ' {0} : {1} ' . format ( host , pipes . quote ( out_path ) ) )
cmd = self . _build_command ( ' scp ' , in_path , u ' {0} : {1} ' . format ( host , pipes . quote ( out_path ) ) )
in_data = None
else :
cmd = self . _build_command ( ' sftp ' , host)
in_data = " put {0} {1} \n " . format ( pipes . quote ( in_path ) , pipes . quote ( out_path ) )
cmd = self . _build_command ( ' sftp ' , to_bytes( host) )
in_data = u " put {0} {1} \n " . format ( pipes . quote ( in_path ) , pipes . quote ( out_path ) )
in_data = to_bytes ( in_data , nonstring = ' passthru ' )
( returncode , stdout , stderr ) = self . _run ( cmd , in_data )
if returncode != 0 :
raise AnsibleError ( " failed to transfer file to {0} : \n {1} \n {2} " . format ( out_path , stdout , stderr) )
raise AnsibleError ( " failed to transfer file to {0} : \n {1} \n {2} " . format ( to_str( out_path) , to_str( stdout) , to_str( stderr) ) )
def fetch_file ( self , in_path , out_path ) :
''' fetch a file from remote to local '''
super ( Connection , self ) . fetch_file ( in_path , out_path )
display . vvv ( " FETCH {0} TO {1} " . format ( in_path , out_path ) , host = self . host )
display . vvv ( u " FETCH {0} TO {1} " . format ( in_path , out_path ) , host = self . host )
# scp and sftp require square brackets for IPv6 addresses, but
# accept them for hostnames and IPv4 addresses too.
host = ' [ %s ] ' % self . host
if C . DEFAULT_SCP_IF_SSH :
cmd = self . _build_command ( ' scp ' , ' {0} : {1} ' . format ( host , pipes . quote ( in_path ) ) , out_path )
cmd = self . _build_command ( ' scp ' , u ' {0} : {1} ' . format ( host , pipes . quote ( in_path ) ) , out_path )
in_data = None
else :
cmd = self . _build_command ( ' sftp ' , host )
in_data = " get {0} {1} \n " . format ( pipes . quote ( in_path ) , pipes . quote ( out_path ) )
in_data = u " get {0} {1} \n " . format ( pipes . quote ( in_path ) , pipes . quote ( out_path ) )
in_data = to_bytes ( in_data , nonstring = ' passthru ' )
( returncode , stdout , stderr ) = self . _run ( cmd , in_data )
if returncode != 0 :