Procházet zdrojové kódy

OSmorphing: Add windows registry operations

Cristian Matiut před 7 měsíci
rodič
revize
010251db8f
1 změnil soubory, kde provedl 29 přidání a 0 odebrání
  1. 29 0
      coriolis/osmorphing/windows.py

+ 29 - 0
coriolis/osmorphing/windows.py

@@ -26,7 +26,9 @@ SERVICE_START_AUTO = 2
 SERVICE_START_MANUAL = 3
 SERVICE_START_DISABLED = 4
 
+SERVICES_PATH_FORMAT = "HKLM:\\%s\\ControlSet001\\Services"
 SERVICE_PATH_FORMAT = "HKLM:\\%s\\ControlSet001\\Services\\%s"
+RUN_PATH_FORMAT = "HKLM:\\%s\\\Microsoft\\Windows\\CurrentVersion\\Run"
 CLOUDBASEINIT_SERVICE_NAME = "cloudbase-init"
 CLOUDBASE_INIT_DEFAULT_PLUGINS = [
     'cloudbaseinit.plugins.common.mtu.MTUPlugin',
@@ -287,6 +289,22 @@ class BaseWindowsMorphingTools(base.BaseOSMorphingTools):
             "%(start_mode)s" %
             {"path": registry_path, "start_mode": start_mode})
 
+    def _set_services_start_mode(self, key_name, service_names, start_mode):
+        LOG.info("Setting service start mode: %(service_names)s, "
+                 "%(start_mode)s", {"service_names": service_names,
+                                    "start_mode": start_mode})
+        registry_paths = [SERVICE_PATH_FORMAT % (key_name, service)
+                          for service in service_names]
+        paths_string = ", ".join(f"'{path}'" for path in registry_paths)
+        self._conn.exec_ps_command(
+            f"""
+            $ErrorActionPreference='Stop';
+            @({paths_string}) | ForEach-Object {{
+                Set-ItemProperty -Path $_ -Name 'Start' -Value {start_mode}
+            }}
+            """,
+            ignore_stdout=True)
+
     def _create_service(self, key_name, service_name, image_path,
                         display_name, description,
                         start_mode=SERVICE_START_AUTO,
@@ -321,6 +339,17 @@ class BaseWindowsMorphingTools(base.BaseOSMorphingTools):
              "start_mode": start_mode},
             ignore_stdout=True)
 
+    def _delete_startup_entry(self, key_name, service_name):
+        registry_path = RUN_PATH_FORMAT % key_name
+        LOG.info("Deleting startup entry: %s", service_name)
+
+        self._conn.exec_ps_command(
+            "$ErrorActionPreference = 'Stop';"
+            "Remove-ItemProperty -Path '%(path)s' -Name '%(entry)s' -Force"
+            % {"path": registry_path, "entry": service_name},
+            ignore_stdout=True,
+        )
+
     def run_user_script(self, user_script):
         if len(user_script) == 0:
             return