[virt-tools-list] [virt-bootstrap] [PATCH v5 05/11] Add support for setting root passowrd in qcow2
Radostin Stoyanov
rstoyanov1 at gmail.com
Mon Jul 24 08:14:05 UTC 2017
For containers bootstrapped in qcow2 format use the tool 'virt-edit'
to insert the hashed root password in the shadow file of the last layer
---
src/virtBootstrap/utils.py | 26 +++++++++++++++++++++++++-
src/virtBootstrap/virt_bootstrap.py | 15 +++++++--------
2 files changed, 32 insertions(+), 9 deletions(-)
diff --git a/src/virtBootstrap/utils.py b/src/virtBootstrap/utils.py
index e1e681c..2c79d6b 100644
--- a/src/virtBootstrap/utils.py
+++ b/src/virtBootstrap/utils.py
@@ -30,6 +30,7 @@ import os
import sys
import tempfile
import logging
+import re
from subprocess import CalledProcessError, PIPE, Popen
import passlib.hosts
@@ -332,7 +333,7 @@ def str2float(element):
return None
-def set_root_password(rootfs, password):
+def set_root_password_in_rootfs(rootfs, password):
"""
Set password on the root user within root filesystem
"""
@@ -364,6 +365,29 @@ def set_root_password(rootfs, password):
os.chmod(shadow_file, shadow_file_permissions)
+def set_root_password_in_image(image, password):
+ """
+ Set password on the root user within image
+ """
+ password_hash = passlib.hosts.linux_context.hash(password)
+ execute(['virt-edit',
+ '-a', image, '/etc/shadow',
+ '-e', 's,^root:.*?:,root:%s:,' % re.escape(password_hash)])
+
+
+def set_root_password(fmt, dest, root_password):
+ """
+ Set root password
+ """
+ if fmt == "dir":
+ set_root_password_in_rootfs(dest, root_password)
+ elif fmt == "qcow2":
+ layers = [layer for layer in os.listdir(dest)
+ if layer.startswith('layer-')]
+ set_root_password_in_image(os.path.join(dest, max(layers)),
+ root_password)
+
+
def write_progress(prog):
"""
Write progress output to console
diff --git a/src/virtBootstrap/virt_bootstrap.py b/src/virtBootstrap/virt_bootstrap.py
index 5506445..c9bf1c8 100755
--- a/src/virtBootstrap/virt_bootstrap.py
+++ b/src/virtBootstrap/virt_bootstrap.py
@@ -200,14 +200,13 @@ def bootstrap(uri, dest,
no_cache=no_cache,
progress=prog).unpack(dest)
- if fmt == "dir":
- if root_password is not None:
- logger.info("Setting password of the root account")
- utils.set_root_password(dest, root_password)
-
- if uid_map or gid_map:
- logger.info("Mapping UID/GID")
- mapping_uid_gid(dest, uid_map, gid_map)
+ if root_password is not None:
+ logger.info("Setting password of the root account")
+ utils.set_root_password(fmt, dest, root_password)
+
+ if fmt == "dir" and uid_map or gid_map:
+ logger.info("Mapping UID/GID")
+ mapping_uid_gid(dest, uid_map, gid_map)
def set_logging_conf(loglevel=None):
--
2.9.4
More information about the virt-tools-list
mailing list