[et-mgmt-tools] [PATCH] cobbler reposync/createrepo bugfixes and enhancements

Perry Myers pmyers at redhat.com
Thu Jun 7 14:14:35 UTC 2007


Patch to some of the python scripts in cobbler to do the following:

1. There was a bug in action_reposync.py:createrepo_walker that caused createrepo to be run on every subdirectory of the repository being synced.  The core problem was fnames = [] which creates a new list instead of del fnames [:] which modifies the list in place.
2. Added a new parameter to repos (--createrepo-flags) to be used for passing useful flags like "-c cache -C -g repodata/comps.xml" when createrepo is called.  This touched a few of the python scripts.
3. Modified createrepo in action_import to use the -c cache flag so that future syncs using this repo don't have to regenerate everything.

Please let me know if you have any comments on any of the above changes.

Signed-off-by: Perry Myers (pmyers at redhat.com)

Thanks,

Perry

-- 
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 703 362 9622 -=|

diff -Naur cobbler/cobbler/action_import.py cobbler-mod/cobbler/action_import.py
--- cobbler/cobbler/action_import.py	2007-06-06 16:33:33.000000000 -0400
+++ cobbler-mod/cobbler/action_import.py	2007-06-07 09:36:02.000000000 -0400
@@ -339,7 +339,7 @@
            if not self.processed_repos.has_key(comps_path):
                utils.remove_yum_olddata(comps_path)
                #cmd = "createrepo --basedir / --groupfile %s %s" % (os.path.join(comps_path, masterdir, comps_file), comps_path)
-               cmd = "createrepo --groupfile %s %s" % (os.path.join(comps_path, masterdir, comps_file), comps_path)
+               cmd = "createrepo -c cache --groupfile %s %s" % (os.path.join(comps_path, masterdir, comps_file), comps_path)
                print _("- %s") % cmd
                sub_process.call(cmd,shell=True)
                self.processed_repos[comps_path] = 1
diff -Naur cobbler/cobbler/action_reposync.py cobbler-mod/cobbler/action_reposync.py
--- cobbler/cobbler/action_reposync.py	2007-06-06 16:33:33.000000000 -0400
+++ cobbler-mod/cobbler/action_reposync.py	2007-06-07 09:43:40.000000000 -0400
@@ -45,7 +45,7 @@
         self.systems  = config.systems()
         self.settings = config.settings()
         self.repos    = config.repos()
-    
+
     # ==================================================================================
 
     def run(self,verbose=True):
@@ -59,13 +59,11 @@
             mirror = repo.mirror
             if not os.path.isdir(repo_path) and not repo.mirror.lower().startswith("rhn://"):
                 os.makedirs(repo_path)
-            # if path contains http:// or ftp://, use with yum's reposync.
-            # else do rsync
-            lower = mirror.lower()
-            if lower.startswith("http://") or lower.startswith("ftp://") or lower.startswith("rhn://"):
-                self.do_reposync(repo)
-            else:
+            
+            if repo.is_rsync_mirror():
                 self.do_rsync(repo)
+            else:
+                self.do_reposync(repo)
 
         return True
     
@@ -178,8 +176,7 @@
 
         # now run createrepo to rebuild the index
 
-        arg = None
-        os.path.walk(dest_path, self.createrepo_walker, arg)
+        os.path.walk(dest_path, self.createrepo_walker, repo)
 
         # create the config file the hosts will use to access the repository.
 
@@ -210,9 +207,8 @@
         rc = sub_process.call(cmd, shell=True)
         if rc !=0:
             raise CX(_("cobbler reposync failed"))
-        arg = {}
         print _("- walking: %s") % dest_path
-        os.path.walk(dest_path, self.createrepo_walker, arg)
+        os.path.walk(dest_path, self.createrepo_walker, repo)
         self.create_local_file(repo, dest_path)
     
     # ==================================================================================
@@ -243,19 +239,19 @@
 
     # ==================================================================================
 
-    def createrepo_walker(self, arg, dirname, fname):
+    def createrepo_walker(self, repo, dirname, fnames):
         """
         Used to run createrepo on a copied mirror.
         """
         target_dir = os.path.dirname(dirname).split("/")[-1]
-        print _("- scanning: %s") % target_dir
-        if target_dir.lower() in [ "i386", "x86_64", "ia64" ] or (arg is None):
+        if target_dir.lower() in [ "i386", "x86_64", "ia64" ] or not repo.is_rsync_mirror():
             utils.remove_yum_olddata(dirname)
             try:
-                cmd = "createrepo %s" % dirname
+                cmd = "createrepo %s %s" % (repo.createrepo_flags, dirname)
                 print _("- %s") % cmd
                 sub_process.call(cmd, shell=True)
             except:
                 print _("- createrepo failed.  Is it installed?")
-            fnames = []  # we're in the right place                  
+            del fnames[:] # we're in the right place
+
             
diff -Naur cobbler/cobbler/cobbler.py cobbler-mod/cobbler/cobbler.py
--- cobbler/cobbler/cobbler.py	2007-06-06 16:33:33.000000000 -0400
+++ cobbler-mod/cobbler/cobbler.py	2007-06-07 09:36:02.000000000 -0400
@@ -432,7 +432,8 @@
            '--mirror'           :  lambda(a): repo.set_mirror(a),
            '--keep-updated'     :  lambda(a): repo.set_keep_updated(a),
            '--local-filename'   :  lambda(a): repo.set_local_filename(a),
-           '--rpm-list'         :  lambda(a): repo.set_rpm_list(a)
+           '--rpm-list'         :  lambda(a): repo.set_rpm_list(a),
+           '--createrepo-flags' :  lambda(a): repo.set_createrepo_flags(a),
         }
         def on_ok():
             if newname is not None:
diff -Naur cobbler/cobbler/item_repo.py cobbler-mod/cobbler/item_repo.py
--- cobbler/cobbler/item_repo.py	2007-06-06 16:33:33.000000000 -0400
+++ cobbler-mod/cobbler/item_repo.py	2007-06-07 09:36:02.000000000 -0400
@@ -30,14 +30,16 @@
         self.mirror = None                           # is required
         self.keep_updated = 1                        # has reasonable defaults
         self.local_filename = ""                     # off by default
-        self.rpm_list = ""                      # just get selected RPMs + deps
+        self.rpm_list = ""                           # just get selected RPMs + deps
+        self.createrepo_flags = ""                   # none by default
 
     def from_datastruct(self,seed_data):
-        self.name           = self.load_item(seed_data, 'name')
-        self.mirror         = self.load_item(seed_data, 'mirror')
-        self.keep_updated   = self.load_item(seed_data, 'keep_updated')
-        self.local_filename = self.load_item(seed_data, 'local_filename')
-        self.rpm_list       = self.load_item(seed_data, 'rpm_list')
+        self.name             = self.load_item(seed_data, 'name')
+        self.mirror           = self.load_item(seed_data, 'mirror')
+        self.keep_updated     = self.load_item(seed_data, 'keep_updated')
+        self.local_filename   = self.load_item(seed_data, 'local_filename')
+        self.rpm_list         = self.load_item(seed_data, 'rpm_list')
+        self.createrepo_flags = self.load_item(seed_data, 'createrepo_flags')
         return self
 
     def set_name(self,name):
@@ -98,6 +100,14 @@
             pass
         self.rpm_list = rpmlist 
 
+    def set_createrepo_flags(self,createrepo_flags):
+        """
+        Flags passed to createrepo when it is called.  Common flags to use would be
+        -c cache or -g comps.xml to generate group information.
+        """
+        self.createrepo_flags = createrepo_flags
+        return True
+
     def is_valid(self):
         """
 	A repo is valid if it has a name and a mirror URL
@@ -110,18 +120,30 @@
 
     def to_datastruct(self):
         return {
-           'name'           : self.name,
-           'mirror'         : self.mirror,
-           'keep_updated'   : self.keep_updated,
-           'local_filename' : self.local_filename,
-           'rpm_list'       : self.rpm_list
+           'name'             : self.name,
+           'mirror'           : self.mirror,
+           'keep_updated'     : self.keep_updated,
+           'local_filename'   : self.local_filename,
+           'rpm_list'         : self.rpm_list,
+           'createrepo_flags' : self.createrepo_flags
         }
 
     def printable(self):
-        buf =       _("repo            : %s\n") % self.name
-        buf = buf + _("mirror          : %s\n") % self.mirror
-        buf = buf + _("keep updated    : %s\n") % self.keep_updated
-        buf = buf + _("local filename  : %s\n") % self.local_filename
-        buf = buf + _("rpm list        : %s\n") % self.rpm_list
+        buf =       _("repo             : %s\n") % self.name
+        buf = buf + _("mirror           : %s\n") % self.mirror
+        buf = buf + _("keep updated     : %s\n") % self.keep_updated
+        buf = buf + _("local filename   : %s\n") % self.local_filename
+        buf = buf + _("rpm list         : %s\n") % self.rpm_list
+        buf = buf + _("createrepo_flags : %s\n") % self.createrepo_flags
         return buf
 
+    def is_rsync_mirror(self):
+        """
+        Returns True if this mirror is synchronized using rsync, False otherwise
+        """
+        lower = self.mirror.lower()
+        if lower.startswith("http://") or lower.startswith("ftp://") or lower.startswith("rhn://"):
+            return False
+        else:
+            return True
+





More information about the et-mgmt-tools mailing list