>>> Should I understand that x86 is the canonical name for i386?
>
> It's the name we are going to use to describe 32 bit systems to avoid
> the baggage of debating whether "i386" referers
> to i386 compatible instructions or can include i686, which is pretty
> much omnipresent now.

Once solved my misunderstanding, I submit the patch again, with the
right architecture mapping. This time I've preferred not to touch anything
not directly related to import, and I've enlarged the patch a little bit. Now
it performs a complete import, including a minimal sample.seed file.
It still does not write right append options for pxe in order to actually
find the location of the preseed file.

Javier Palacios
diff --git a/cobbler/action_import.py b/cobbler/action_import.py
index babdafd..b0be882 100644
--- a/cobbler/action_import.py
+++ b/cobbler/action_import.py
@@ -37,6 +37,7 @@ WGET_CMD = "wget --mirror --no-parent --no-host-directories 
--directory-prefix %
 RSYNC_CMD =  "rsync -a %s '%s' %s/ks_mirror/%s 
--exclude-from=/etc/cobbler/rsync.exclude --progress"
 
 TRY_LIST = [
+   "pool",
    "Fedora", "Packages", "RedHat", "Client", "Server", "Centos", "CentOS",
    "Fedora/RPMS", "RedHat/RPMS", "Client/RPMS", "Server/RPMS", "Centos/RPMS",
    "CentOS/RPMS", "RPMS"
@@ -44,7 +45,10 @@ TRY_LIST = [
 
 class Importer:
 
-   def 
__init__(self,api,config,mirror,mirror_name,network_root=None,kickstart_file=None,rsync_flags=None,arch=None):
+   validarchs = [ "x86", "ia64", "x86_64", "s390x" ]
+   archmaps = { "i386" : "x86" , "amd64" : "x86_64" , "386" : "" , "amd" : "" }
+
+   def 
__init__(self,api,config,mirror,mirror_name,network_root=None,kickstart_file=None,rsync_flags=None,arch=None,breed=None):
        """
        Performs an import of a install tree (or trees) from the given
        mirror address.  The prefix of the distro is to be specified
@@ -68,6 +72,7 @@ class Importer:
        self.kickstart_file = kickstart_file
        self.rsync_flags = rsync_flags
        self.arch = arch
+       self.breed = breed
 
    # ----------------------------------------------------------------------
 
@@ -78,11 +83,8 @@ class Importer:
            raise CX(_("import failed.  no --name specified"))
        if self.arch is not None:
            self.arch = self.arch.lower()
-           if self.arch not in [ "i386", "x86", "ia64", "x86_64", "s390x" ]:
-               raise CX(_("arch must be x86, x86_64, s390x, or ia64"))
-           if self.arch == "x86":
-               # be consistent
-               self.arch = "i386"
+           if self.arch not in self.validarchs:
+               raise CX(_("arch must be one of %s")) % ", ".join(validarchs)
 
        mpath = os.path.join(self.settings.webdir, "ks_mirror", 
self.mirror_name)
 
@@ -92,16 +94,11 @@ class Importer:
        if self.arch:
            # append the arch path to the name if the arch is not already
            # found in the name.
-           found = False
-           for x in [ "ia64", "i386", "x86_64", "x86", "s390x" ]:
+           for x in self.validarchs:
                if self.mirror_name.lower().find(x) != -1:
-                   found = True
                    break
-           if not found:
+           else:
                self.mirror_name = self.mirror_name + "-" + self.arch
-
-       if self.mirror_name is None:
-           raise CX(_("import failed.  no --name specified"))
        
        # make the output path and mirror content but only if not specifying 
that a network
        # accessible support location already exists
@@ -139,22 +136,22 @@ class Importer:
            if not self.network_root.endswith("/"):
                self.network_root = self.network_root + "/"
            self.path = self.mirror
-           found_root = False
            valid_roots = [ "nfs://", "ftp://";, "http://"; ]
            for valid_root in valid_roots:
                if self.network_root.startswith(valid_root):
-                   found_root = True
+                   break
+           else:
+               raise CX(_("Network root given to --available-as must be %s")) 
% ", ".join(valid_roots)
            if self.network_root.startswith("nfs://"):
                try:
                    (a,b,rest) = self.network_root.split(":",3)
                except:
                    raise CX(_("Network root given to --available-as is missing 
a colon, please see the manpage example."))
-           if not found_root:
-               raise CX(_("Network root given to --available-as must be 
nfs://, ftp://, or http://";))
 
        self.processed_repos = {}
 
        print _("---------------- (adding distros)")
+       print "to %s" % self.path
        os.path.walk(self.path, self.distro_adder, {})
 
        if self.network_root is None:
@@ -205,7 +202,8 @@ class Importer:
 
            if (self.kickstart_file == None):
                kdir = os.path.dirname(distro.kernel)   
-               base_dir = "/".join(kdir.split("/")[0:-2])
+               # FIXME : Some special handling for network_root might be 
required as in get_proposed_name,
+               base_dir = "/".join(kdir.split("/")[:6])
           
                for try_entry in TRY_LIST:
                    try_dir = os.path.join(base_dir, try_entry)
@@ -220,6 +218,18 @@ class Importer:
                            (flavor, major, minor) = results
                            # print _("- finding default kickstart template for 
%(flavor)s %(major)s") % { "flavor" : flavor, "major" : major }
                            kickstart = self.set_variance(profile, flavor, 
major, minor, distro)
+                       if not rpms:
+                           # search for base-files or base-installer ?
+                           rpms = glob.glob(os.path.join(try_dir, 
"main/b/base-files" , "base-files_*"))
+                           for rpm in rpms:
+                               results = self.scan_deb_filename(rpm)
+                               if results is None:
+                                   continue
+                               (flavor, major, minor) = results
+                               if self.breed and self.breed != flavor:
+                                   raise CX(_("Error: given breed does not 
match imported tree"))
+                               # print _("- finding default kickstart template 
for %(flavor)s %(major)s") % { "flavor" : flavor, "major" : major }
+                               kickstart = self.set_variance(profile, flavor, 
major, minor, distro)
            else:
                print _("- using kickstart file %s") % self.kickstart_file
                profile.set_kickstart(self.kickstart_file)
@@ -329,6 +339,14 @@ class Importer:
            if major >= 5:
                 return profile.set_kickstart("/etc/cobbler/sample.ks")
 
+       if flavor == "debian":
+
+           distro.set_breed("debian")
+           dist_names = { '4.0' : "Etch" , '5.0' : "Lenny" }
+           dist_vers = "%s.%s" % ( major , minor )
+           distro.set_os_version("debian%s" % dist_names[dist_vers])
+           return profile.set_kickstart("/etc/cobbler/sample.seed")
+
        print _("- using default kickstart file choice")
        return profile.set_kickstart("/etc/cobbler/legacy.ks")
 
@@ -378,6 +396,27 @@ class Importer:
        minor = float(accum[1])
        return (flavor, major, minor)
 
+   def scan_deb_filename(self, deb):
+       """
+       Determine what the distro is based on the base-files dpkg filename.
+       """
+
+       deb = os.path.basename(deb)
+
+       # get all the tokens and try to guess a version
+       accum = []
+       tokens = deb.split("_")
+       tokens2 = tokens[1].split(".")
+       for t2 in tokens2:
+          try:
+              val = int(t2)
+              accum.append(val)
+          except:
+              pass
+       accum.append(0)
+
+       return ("debian", accum[0], accum[1])
+
    # ----------------------------------------------------------------------
 
    def distro_adder(self,foo,dirname,fnames):
@@ -389,6 +428,8 @@ class Importer:
 
            fullname = os.path.join(dirname,x)
            if os.path.islink(fullname) and os.path.isdir(fullname):
+              if os.path.realpath(fullname) == os.path.realpath(dirname):
+                continue
               print "- following symlink: %s" % fullname
               os.path.walk(fullname, self.distro_adder, {})
 
@@ -398,8 +439,10 @@ class Importer:
                kernel = os.path.join(dirname,x)
            if initrd is not None and kernel is not None and 
dirname.find("isolinux") == -1:
                self.add_entry(dirname,kernel,initrd)
                path_parts = kernel.split("/")[:-2]
                comps_path = "/".join(path_parts)
+               initrd = None
+               kernel = None
 
 
 
@@ -411,7 +454,8 @@ class Importer:
            print _("- traversing distro %s") % distro.name
            if distro.kernel.find("ks_mirror") != -1:
                basepath = os.path.dirname(distro.kernel)
-               top = "/".join(basepath.split("/")[0:-2]) # up one level
+               # FIXME : Some special handling for network_root might be 
required as in get_proposed_name,
+               top = "/".join(basepath.split("/")[:6])
                print _("- descent into %s") % top
                os.path.walk(top, self.repo_scanner, distro)
            else:
@@ -568,9 +612,6 @@ class Importer:
 
    def get_proposed_name(self,dirname,pxe_arch):
        archname = pxe_arch
-       if archname == "x86":
-          # be consistent
-          archname = "i386"
        # FIXME: this is new, needs testing ...
        if self.network_root is not None:
           name = "-".join(self.path_tail(self.path,dirname).split("/"))
@@ -587,16 +628,11 @@ class Importer:
        name = name.replace("ks_mirror-","")
        name = name.replace("-pxeboot","")  
        name = name.replace("--","-")
-       name = name.replace("-i386","")
-       name = name.replace("_i386","")
-       name = name.replace("-x86_64","")
-       name = name.replace("_x86_64","")
-       name = name.replace("-ia64","")
-       name = name.replace("_ia64","")
-       name = name.replace("-x86","")
-       name = name.replace("_x86","")
-       name = name.replace("-s390x","")
-       name = name.replace("_s390x","")
+       for separator in [ '-' , '_'  , '.' ] :
+         for arch in self.validarchs:
+           name = name.replace("%s%s" % ( separator , arch ),"")
+         for arch in self.archmaps.keys():
+           name = name.replace("%s%s" % ( separator , arch ),"")
        # ensure arch is on the end, regardless of path used.
        name = name + "-" + archname
 
@@ -608,53 +644,39 @@ class Importer:
        """
  
        # don't care about certain directories
-       match = False
        for x in TRY_LIST:
            if dirname.find(x) != -1:
-               match = True
-               continue
-       if not match:
+               break
+       else:
           return
 
        # try to find a kernel header RPM and then look at it's arch.
        for x in fnames:
-           if not x.endswith("rpm"):
+           if not x.endswith("rpm") and not x.endswith("deb"):
                continue
            if x.find("kernel-header") != -1:
                print _("- kernel header found: %s") % x
-               if x.find("i386") != -1:
-                   foo["result"] = "i386"
-                   return
-               elif x.find("x86_64") != -1: 
-                   foo["result"] = "x86_64"
-                   return
-               elif x.find("ia64") != -1:
-                   foo["result"] = "ia64"
-                   return
-               elif x.find("s390") != -1:
-                   foo["result"] = "s390x"
-                   return
+               for arch in self.validarchs:
+                   if x.find(arch) != -1:
+                       foo.append( arch )
+               for arch in self.archmaps.keys():
+                   if x.find(arch) != -1 and self.archmaps[arch]:
+                       foo.append( self.archmaps[arch] )
 
        # This extra code block is a temporary fix for rhel4.x 64bit [x86_64]
        # distro ARCH identification-- L.M.
        # NOTE: eventually refactor to merge in with the above block
        for x in fnames:
-          if not x.endswith("rpm"):
+          if not x.endswith("rpm") and not x.endswith("deb"):
              continue
           if x.find("kernel-largesmp") != -1:
-             print _("- kernel header found: %s") % x
-             if x.find("i386") != -1:
-                foo["result"] = "i386"
-                return
-             elif x.find("x86_64") != -1:
-                foo["result"] = "x86_64"
-                return
-             elif x.find("ia64") != -1:
-                foo["result"] = "ia64"
-                return
-             elif x.find("s390") != -1:
-                foo["result"] = "s390x"
-                return
+             print _("- kernel header found II: %s") % x
+             for arch in self.validarchs:
+                 if x.find(arch) != -1:
+                     foo.append( arch )
+             for arch in self.archmaps.keys() and self.archmaps[arch]:
+                 if x.find(arch) != -1:
+                     foo.append( self.archmaps[arch] )
 
    def learn_arch_from_tree(self,dirname):
        """ 
@@ -663,21 +685,22 @@ class Importer:
        figure out the arch name.  This is important for producing predictable 
distro names (and profile names)
        from differing import sources
        """
-       dirname2 = "/".join(dirname.split("/")[:-2])  # up two from images, 
then down as many as needed
+       # FIXME : Some special handling for network_root might be required as 
in get_proposed_name,
+       dirname2 = "/".join(dirname.split("/")[:6])
        print _("- scanning %s for architecture info") % dirname2
-       result = { "result" : "i386" } # default, but possibly not correct ... 
+       result = []
        os.path.walk(dirname2, self.arch_walker, result)      
-       return result["result"]
+       if len(result) > 1 :
+           raise CX(_("Importing CD/DVD with multiple architectures is not 
supported"))
+       return result[0]
 
    def get_pxe_arch(self,dirname):
        t = dirname.lower()
-       if t.find("x86_64") != -1:
-          return "x86_64"
-       if t.find("ia64") != -1:
-          return "ia64"
-       if t.find("i386") != -1 or t.find("386") != -1 or t.find("x86") != -1:
-          return "i386"
-       if t.find("s390") != -1:
-          return "s390x"
+       for arch in self.validarchs:
+          if t.find(arch) != -1:
+             return arch
+       for arch in self.archmaps.keys():
+          if t.find(arch) != -1 and self.archmaps[arch]:
+             return self.archmaps[arch]
        return self.learn_arch_from_tree(dirname)
 
diff --git a/cobbler/api.py b/cobbler/api.py
index 3defb05..6e80185 100644
--- a/cobbler/api.py
+++ b/cobbler/api.py
@@ -410,7 +410,7 @@ class BootAPI:
         statusifier = action_status.BootStatusReport(self._config,mode)
         return statusifier.run()
 
-    def 
import_tree(self,mirror_url,mirror_name,network_root=None,kickstart_file=None,rsync_flags=None,arch=None):
+    def 
import_tree(self,mirror_url,mirror_name,network_root=None,kickstart_file=None,rsync_flags=None,arch=None,breed=None):
         """
         Automatically import a directory tree full of distribution files.
         mirror_url can be a string that represents a path, a [EMAIL PROTECTED] 
@@ -420,7 +420,7 @@ class BootAPI:
         """
         self.log("import_tree",[mirror_url, mirror_name, network_root, 
kickstart_file, rsync_flags])
         importer = action_import.Importer(
-            self, self._config, mirror_url, mirror_name, network_root, 
kickstart_file, rsync_flags, arch
+            self, self._config, mirror_url, mirror_name, network_root, 
kickstart_file, rsync_flags, arch, breed
         )
         return importer.run()
 
diff --git a/cobbler/modules/cli_misc.py b/cobbler/modules/cli_misc.py
index f92094a..fdc8d69 100644
--- a/cobbler/modules/cli_misc.py
+++ b/cobbler/modules/cli_misc.py
@@ -74,6 +74,7 @@ class ImportFunction(commands.CobblerFunction):
 
     def add_options(self, p, args):
         p.add_option("--arch",               dest="arch",               
help="explicitly specify the architecture being imported (RECOMENDED)")
+        p.add_option("--breed",              dest="breed",              
help="explicitly specify the breed being imported (RECOMENDED)")
         p.add_option("--path",               dest="mirror",             
help="local path or rsync location (REQUIRED)")
         p.add_option("--mirror",             dest="mirror_alt",         
help="alias for --path")
         p.add_option("--name",               dest="name",               
help="name, ex 'RHEL-5', (REQUIRED)")
@@ -94,7 +95,8 @@ class ImportFunction(commands.CobblerFunction):
                 network_root=self.options.available_as,
                 kickstart_file=self.options.kickstart_file,
                 rsync_flags=self.options.rsync_flags,
-                arch=self.options.arch
+                arch=self.options.arch,
+                breed=self.options.breed
         )
 
 

Attachment: sample.seed
Description: Binary data

_______________________________________________
cobbler mailing list
[email protected]
https://fedorahosted.org/mailman/listinfo/cobbler

Reply via email to