]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
python: Move helper functions for functional levels into a new file
authorAndrew Bartlett <abartlet@samba.org>
Tue, 9 May 2023 03:50:46 +0000 (15:50 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 16 May 2023 23:29:32 +0000 (23:29 +0000)
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Joseph Sutton <josephsutton@catalyst.net.nz>
python/samba/functional_level.py [new file with mode: 0644]
python/samba/netcmd/domain/__init__.py
python/samba/netcmd/domain/common.py
python/samba/netcmd/domain/functional_prep.py
python/samba/netcmd/domain/level.py

diff --git a/python/samba/functional_level.py b/python/samba/functional_level.py
new file mode 100644 (file)
index 0000000..1cb09ce
--- /dev/null
@@ -0,0 +1,62 @@
+# domain management - common code
+#
+# Copyright Catlayst .Net Ltd 2017-2023
+# Copyright Jelmer Vernooij 2007-2012
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+from samba.dsdb import (
+    DS_DOMAIN_FUNCTION_2000,
+    DS_DOMAIN_FUNCTION_2003,
+    DS_DOMAIN_FUNCTION_2008,
+    DS_DOMAIN_FUNCTION_2008_R2,
+    DS_DOMAIN_FUNCTION_2012,
+    DS_DOMAIN_FUNCTION_2012_R2,
+    DS_DOMAIN_FUNCTION_2003_MIXED,
+    DS_DOMAIN_FUNCTION_2016
+)
+
+string_version_to_constant = {
+    "2000": DS_DOMAIN_FUNCTION_2000,
+    "2003": DS_DOMAIN_FUNCTION_2003,
+    "2008": DS_DOMAIN_FUNCTION_2008,
+    "2008_R2": DS_DOMAIN_FUNCTION_2008_R2,
+    "2012": DS_DOMAIN_FUNCTION_2012,
+    "2012_R2": DS_DOMAIN_FUNCTION_2012_R2,
+    "2016": DS_DOMAIN_FUNCTION_2016,
+}
+
+
+def string_to_level(string):
+    """Interpret a string indicating a functional level."""
+    return string_version_to_constant[string]
+
+
+def level_to_string(level):
+    """turn the level enum number into a printable string."""
+    if level < DS_DOMAIN_FUNCTION_2000:
+        return "invalid"
+    strings = {
+        DS_DOMAIN_FUNCTION_2000: "2000",
+        DS_DOMAIN_FUNCTION_2003_MIXED: \
+            "2003 with mixed domains/interim (NT4 DC support)",
+        DS_DOMAIN_FUNCTION_2003: "2003",
+        DS_DOMAIN_FUNCTION_2008: "2008",
+        DS_DOMAIN_FUNCTION_2008_R2: "2008 R2",
+        DS_DOMAIN_FUNCTION_2012: "2012",
+        DS_DOMAIN_FUNCTION_2012_R2: "2012 R2",
+        DS_DOMAIN_FUNCTION_2016: "2016",
+    }
+    return strings.get(level, "higher than 2016")
index 552784e180d87d708614c8017c7527e0ba6d06a8..3defc120be7a15ff39383d0f4a109d6702bd4b03 100644 (file)
@@ -29,7 +29,7 @@ from .backup import cmd_domain_backup
 from .claim import cmd_domain_claim
 from .classicupgrade import cmd_domain_classicupgrade
 from .common import (common_join_options, common_ntvfs_options,
-                     common_provision_join_options, string_to_level)
+                     common_provision_join_options)
 from .dcpromo import cmd_domain_dcpromo
 from .demote import cmd_domain_demote
 from .functional_prep import cmd_domain_functional_prep
index f89146f4abd614a2224278b96e069115d353652f..15c8935dae75e7d557e74659bec768fe532d214f 100644 (file)
 
 from uuid import UUID
 
-from samba.dsdb import (
-    DS_DOMAIN_FUNCTION_2000,
-    DS_DOMAIN_FUNCTION_2003,
-    DS_DOMAIN_FUNCTION_2008,
-    DS_DOMAIN_FUNCTION_2008_R2,
-    DS_DOMAIN_FUNCTION_2012,
-    DS_DOMAIN_FUNCTION_2012_R2,
-    DS_DOMAIN_FUNCTION_2003_MIXED,
-    DS_DOMAIN_FUNCTION_2016
-)
 from samba.netcmd import CommandError, Option
 from samba.samdb import get_default_backend_store
 
@@ -76,43 +66,6 @@ common_join_options = [
 ]
 
 
-string_version_to_constant = {
-    "2000": DS_DOMAIN_FUNCTION_2000,
-    "2003": DS_DOMAIN_FUNCTION_2003,
-    "2008": DS_DOMAIN_FUNCTION_2008,
-    "2008_R2": DS_DOMAIN_FUNCTION_2008_R2,
-    "2012": DS_DOMAIN_FUNCTION_2012,
-    "2012_R2": DS_DOMAIN_FUNCTION_2012_R2,
-    "2016": DS_DOMAIN_FUNCTION_2016,
-}
-
-
-def string_to_level(string):
-    """Interpret a string indicating a functional level."""
-    try:
-        return string_version_to_constant[string]
-    except KeyError as e:
-        raise CommandError(f"'{string}' is not a valid domain level")
-
-
-def level_to_string(level):
-    """turn the level enum number into a printable string."""
-    if level < DS_DOMAIN_FUNCTION_2000:
-        return "invalid"
-    strings = {
-        DS_DOMAIN_FUNCTION_2000: "2000",
-        DS_DOMAIN_FUNCTION_2003_MIXED: \
-            "2003 with mixed domains/interim (NT4 DC support)",
-        DS_DOMAIN_FUNCTION_2003: "2003",
-        DS_DOMAIN_FUNCTION_2008: "2008",
-        DS_DOMAIN_FUNCTION_2008_R2: "2008 R2",
-        DS_DOMAIN_FUNCTION_2012: "2012",
-        DS_DOMAIN_FUNCTION_2012_R2: "2012 R2",
-        DS_DOMAIN_FUNCTION_2016: "2016",
-    }
-    return strings.get(level, "higher than 2016")
-
-
 def parse_text(value):
     """Parse message element to string value."""
     if value is not None:
index 4253ffd7521381e47e2e125cbf9bc7bbf0eb75ae..3e1d4e155c1f6913139f655805c801e8c1f2f0ce 100644 (file)
@@ -30,7 +30,7 @@ from samba.netcmd import Command, CommandError, Option
 from samba.netcmd.fsmo import get_fsmo_roleowner
 from samba.samdb import SamDB
 
-from .common import string_to_level
+from samba import functional_level
 
 
 class cmd_domain_functional_prep(Command):
@@ -66,7 +66,12 @@ class cmd_domain_functional_prep(Command):
         lp = sambaopts.get_loadparm()
         creds = credopts.get_credentials(lp)
         H = kwargs.get("H")
-        target_level = string_to_level(kwargs.get("function_level"))
+        function_level = kwargs.get("function_level")
+        try:
+            target_level = functional_level.string_to_level(function_level)
+        except KeyError:
+            raise CommandError(f"'{function_level}' is not known to Samba as an AD functional level")
+
         forest_prep = kwargs.get("forest_prep")
         domain_prep = kwargs.get("domain_prep")
 
index c5773d4e9ce484a8e314969e84e2ef7a9fa037ef..4a12a46dff2e27b26b6a6836bcbba0f89387545d 100644 (file)
@@ -29,7 +29,7 @@ from samba.dsdb import DS_DOMAIN_FUNCTION_2000
 from samba.netcmd import Command, CommandError, Option
 from samba.samdb import SamDB
 
-from .common import level_to_string, string_to_level
+from samba import functional_level
 
 
 class cmd_domain_level(Command):
@@ -118,23 +118,26 @@ class cmd_domain_level(Command):
 
             self.message("")
 
-            outstr = level_to_string(level_forest)
+            outstr = functional_level.level_to_string(level_forest)
             self.message("Forest function level: (Windows) " + outstr)
 
             if level_domain == DS_DOMAIN_FUNCTION_2000 and level_domain_mixed:
                 outstr = "2000 mixed (NT4 DC support)"
             else:
-                outstr = level_to_string(level_domain)
+                outstr = functional_level.level_to_string(level_domain)
             self.message("Domain function level: (Windows) " + outstr)
 
-            outstr = level_to_string(min_level_dc)
+            outstr = functional_level.level_to_string(min_level_dc)
             self.message("Lowest function level of a DC: (Windows) " + outstr)
 
         elif subcommand == "raise":
             msgs = []
 
             if domain_level is not None:
-                new_level_domain = string_to_level(domain_level)
+                try:
+                    new_level_domain = functional_level.string_to_level(domain_level)
+                except KeyError:
+                    raise CommandError(f"New functional level '{domain_level}' is not known to Samba as an AD functional level")
 
                 if new_level_domain <= level_domain and level_domain_mixed == 0:
                     raise CommandError("Domain function level can't be smaller than or equal to the actual one!")