ee37f25ee939 — Alain Leufroy 3 years ago
edit: stop/restart descendannts automatically with --stop-others.
1 files changed, 24 insertions(+), 8 deletions(-)

M overlayctl
M overlayctl +24 -8
@@ 604,19 604,26 @@ def _get_editor_on_file(filename):
     Popen(cmd, shell=True).wait()
 
 
-def editer(name, appended=None, prepended=None, removed=None, keep_others=False):
+def editer(
+        name, appended=None, prepended=None, removed=None,
+        stop_others=False, keep_others=False):
     """Ask user to edit lowers of the given overlay name, rewrite
     the metadata and unit files accordingly, finaly retart systemd units
     of the edited overlay.
     """
     layer = build_layer(name)
+    to_stop = []
     if not keep_others:
-        to_stop = [layer for layer in _iter_descendants(layer) if layer.automountunit.is_active()]
+        to_stop[:] = [layer for layer in _iter_descendants(layer)
+                      if layer.automountunit.is_active()]
         if to_stop:
-            # XXX automatic stop/start
-            logger.error(
-                'You should prefere to stop the following overlays: \n\n%s\n',
-                ', '.join(x.name for x in to_stop))
+            if stop_others:
+                for descendant in to_stop:
+                    descendant.stop()
+            else:
+                logger.error(
+                    'You should prefere to stop the following overlays: \n\n%s\n',
+                    ', '.join(x.name for x in to_stop))
             return
     if not appended and not prepended and not removed:
         with NamedTemporaryFile() as fobj:

          
@@ 647,7 654,9 @@ def editer(name, appended=None, prepende
     with layer.temporary_stop():
         layer.lowers[:] = lowers
         layer.dump()
-    systemctl.daemon_reload()
+        systemctl.daemon_reload()
+    for descendant in to_stop:
+        descendant.start()
     # XXX propagate to descendants
     logger.debug("Systemd \"%s\" restarted", layer.unitname)
     logger.info("\"%s\" updated", layer.name)

          
@@ 1019,6 1028,13 @@ def main():
         '-d', '--delete', action='append', help="append the following names",
     )
     edit.add_argument(
+        '--stop-others', '-s',
+        action='store_true',
+        default=False,
+        help=('automatically stop descendants to prevent broken mount point. '
+              'Restart them afterward.')
+    )
+    edit.add_argument(
         '--keep-others', '-K',
         action='store_true',
         default=False,

          
@@ 1035,7 1051,7 @@ def main():
     )
 
     def _editer(args):
-        editer(args.mountdir, args.append, args.prepend, args.delete, args.keep_others)
+        editer(args.mountdir, args.append, args.prepend, args.delete, args.stop_others, args.keep_others)
 
     edit.set_defaults(func=_editer)