[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