From: Daniel Henrique Barboza <danielhb(a)linux.vnet.ibm.com>
This patch changes the password-less setup to use the
provided user instead of defaulting to 'root'.
A new message was added to reflect a case where the remote
host does not have the '.ssh' dir and the setup couldn't
be completed.
Signed-off-by: Daniel Henrique Barboza <danielhb(a)linux.vnet.ibm.com>
---
i18n.py | 1 +
model/vms.py | 38 +++++++++++++++++++++++++-------------
2 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/i18n.py b/i18n.py
index 82c679b..35a147c 100644
--- a/i18n.py
+++ b/i18n.py
@@ -139,6 +139,7 @@ messages = {
"KCHVM0086E": _("Virtual machine description must be a string"),
"KCHVM0087E": _("console parameter is only supported for s390x/s390
architecture."),
"KCHVM0088E": _("invalid console type, supported types are
sclp/virtio."),
+ "KCHVM0089E": _("Unable to setup password-less login at remote host
%(host)s using user %(user)s: remote directory %(sshdir)s does not exist."),
"KCHVMHDEV0001E": _("VM %(vmid)s does not contain directly assigned
host device %(dev_name)s."),
"KCHVMHDEV0002E": _("The host device %(dev_name)s is not allowed to
directly assign to VM."),
diff --git a/model/vms.py b/model/vms.py
index a1b0df7..209b41b 100644
--- a/model/vms.py
+++ b/model/vms.py
@@ -1716,7 +1716,7 @@ class VMModel(object):
return local_sub_per_core
def _get_remote_ppc64_subpercore(remote_host, user):
- username_host = "%s@%s" % ('root', remote_host)
+ username_host = "%s@%s" % (user, remote_host)
ssh_cmd = ['ssh', '-oNumberOfPasswordPrompts=0',
'-oStrictHostKeyChecking=no', username_host,
'ppc64_cpu', '--subcores-per-core']
@@ -1737,7 +1737,7 @@ class VMModel(object):
def _check_if_password_less_login_enabled(self, remote_host,
user, password):
- username_host = "%s@%s" % ('root', remote_host)
+ username_host = "%s@%s" % (user, remote_host)
ssh_cmd = ['ssh', '-oNumberOfPasswordPrompts=0',
'-oStrictHostKeyChecking=no', username_host,
'echo', 'hello']
@@ -1745,32 +1745,35 @@ class VMModel(object):
if returncode != 0:
if password is None:
raise OperationFailed("KCHVM0056E",
- {'host': remote_host, 'user':
'root'})
+ {'host': remote_host, 'user':
user})
else:
self._set_password_less_login(remote_host, user, password)
def _set_password_less_login(self, remote_host, user, passwd):
- id_rsa_file = "/root/.ssh/id_rsa.pub"
+ home_dir = '/root' if user is 'root' else '/home/%s' %
user
+
+ id_rsa_file = "%s/.ssh/id_rsa" % home_dir
+ id_rsa_pub_file = id_rsa_file + '.pub'
ssh_port = 22
ssh_client = None
def create_root_ssh_key_if_required():
- if not os.path.isfile(id_rsa_file):
+ if not os.path.isfile(id_rsa_pub_file):
with open("/dev/zero") as zero_input:
- cmd = ['ssh-keygen', '-q', '-N', '']
+ cmd = ['ssh-keygen', '-q', '-N', '',
'-f', id_rsa_file]
proc = subprocess.Popen(
cmd,
stdin=zero_input,
stdout=open(os.devnull, 'wb')
)
out, err = proc.communicate()
- if not os.path.isfile(id_rsa_file):
+ if not os.path.isfile(id_rsa_pub_file):
raise OperationFailed("KCHVM0070E")
def read_id_rsa_pub_file():
data = None
- with open(id_rsa_file, "r") as id_file:
+ with open(id_rsa_pub_file, "r") as id_file:
data = id_file.read()
return data
@@ -1783,9 +1786,18 @@ class VMModel(object):
def append_id_rsa_to_remote_authorized_keys(ssh_client, id_rsa_data):
sftp_client = ssh_client.open_sftp()
+ ssh_dir = '%s/.ssh' % home_dir
+
+ try:
+ sftp_client.chdir(ssh_dir)
+ except IOError:
+ raise OperationFailed(
+ "KCHVM0089E",
+ {'host': remote_host, 'user': user, 'sshdir':
ssh_dir}
+ )
file_handler = sftp_client.file(
- '/root/.ssh/authorized_keys',
+ '%s/.ssh/authorized_keys' % home_dir,
mode='a',
bufsize=1
)
@@ -1832,7 +1844,7 @@ class VMModel(object):
self._check_ppc64_subcores_per_core(remote_host, user)
def _check_if_path_exists_in_remote_host(self, path, remote_host, user):
- username_host = "%s@%s" % ('root', remote_host)
+ username_host = "%s@%s" % (user, remote_host)
cmd = ['ssh', '-oStrictHostKeyChecking=no', username_host,
'test', '-e', path]
_, _, returncode = run_command(cmd, 5, silent=True)
@@ -1853,7 +1865,7 @@ class VMModel(object):
return False
def _create_remote_path(self, path, remote_host, user):
- username_host = "%s@%s" % ('root', remote_host)
+ username_host = "%s@%s" % (user, remote_host)
cmd = ['ssh', '-oStrictHostKeyChecking=no', username_host,
'touch', path]
_, _, returncode = run_command(cmd, 5, silent=True)
@@ -1875,7 +1887,7 @@ class VMModel(object):
)
def _create_remote_disk(self, disk_info, remote_host, user):
- username_host = "%s@%s" % ('root', remote_host)
+ username_host = "%s@%s" % (user, remote_host)
disk_fmt = disk_info.get('format')
disk_path = disk_info.get('path')
disk_size = self._get_img_size(disk_path)
@@ -1920,7 +1932,7 @@ class VMModel(object):
user = 'root'
self.migration_pre_check(remote_host, user, password)
- dest_conn = self._get_remote_libvirt_conn(remote_host)
+ dest_conn = self._get_remote_libvirt_conn(remote_host, user)
non_shared = self._check_if_nonshared_migration(
name,
--
2.7.4