diff options
| author | Scott Henson <shenson@redhat.com> | 2009-08-19 21:17:29 -0400 |
|---|---|---|
| committer | Scott Henson <shenson@redhat.com> | 2009-08-21 16:54:34 -0400 |
| commit | 60fe75a5f557c2045bc6b71f9cb12693e8fb22f2 (patch) | |
| tree | b9171e86a418a1932854c2c6d7e256079e36ae82 | |
| parent | 80766507dceaf68b2a6d4a6083d3f2bfa48a6a4a (diff) | |
| download | cobbler-60fe75a5f557c2045bc6b71f9cb12693e8fb22f2.tar.gz cobbler-60fe75a5f557c2045bc6b71f9cb12693e8fb22f2.tar.xz cobbler-60fe75a5f557c2045bc6b71f9cb12693e8fb22f2.zip | |
Manage Rsync
- cobbler can now manage /etc/rsyncd.conf and populate it with repos and distros
- cobbler will now check that rsync is enabled
- cobbler will use the rsync daemon in replicate functions
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | cobbler/action_check.py | 15 | ||||
| -rw-r--r-- | cobbler/action_replicate.py | 39 | ||||
| -rw-r--r-- | cobbler/action_sync.py | 39 | ||||
| -rw-r--r-- | installer_templates/defaults | 1 | ||||
| -rw-r--r-- | installer_templates/settings.template | 3 | ||||
| -rw-r--r-- | setup.py | 3 | ||||
| -rw-r--r-- | templates/rsync.template | 43 |
8 files changed, 123 insertions, 22 deletions
@@ -63,6 +63,7 @@ savestate: cp /etc/cobbler/users.conf $(statepath)/users.conf cp /etc/cobbler/users.digest $(statepath)/users.digest cp /etc/cobbler/dhcp.template $(statepath)/dhcp.template + cp /etc/cobbler/rsync.template $(statepath)/rsync.template restorestate: @@ -74,6 +75,7 @@ restorestate: cp $(statepath)/users.digest /etc/cobbler/users.digest cp $(statepath)/http.conf /etc/httpd/conf.d/cobbler.conf cp $(statepath)/dhcp.template /etc/cobbler/dhcp.template + cp $(statepath)/rsync.template /etc/cobbler/rsync.template find /var/lib/cobbler/triggers | xargs chmod +x chown -R apache /var/www/cobbler chmod -R +x /var/www/cobbler/web diff --git a/cobbler/action_check.py b/cobbler/action_check.py index fa1e601c..8536db1a 100644 --- a/cobbler/action_check.py +++ b/cobbler/action_check.py @@ -77,6 +77,7 @@ class BootCheck: self.check_tftpd_bin(status) self.check_tftpd_dir(status) self.check_tftpd_conf(status) + self.check_rsync_conf(status) self.check_httpd(status) self.check_iptables(status) self.check_yum(status) @@ -339,6 +340,20 @@ class BootCheck: status.append(_("directory needs to be created: %s" % bootloc)) + def check_rsync_conf(self,status): + """ + Check that rsync is enabled to autostart + """ + if os.path.exists("/etc/xinetd.d/rsync"): + f = open("/etc/xinetd.d/rsync") + re_disable = re.compile(r'disable.*=.*yes') + for line in f.readlines(): + if re_disable.search(line) and not line.strip().startswith("#"): + status.append(_("change 'disable' to 'no' in %(file)s") % { "file" : "/etc/xinetd.d/rsync" }) + else: + status.append(_("file %(file)s does not exist") % { "file" : "/etc/xinetd.d/rsync" }) + + def check_dhcpd_conf(self,status): """ NOTE: this code only applies if cobbler is *NOT* set to generate diff --git a/cobbler/action_replicate.py b/cobbler/action_replicate.py index ee14b73a..967fd4b3 100644 --- a/cobbler/action_replicate.py +++ b/cobbler/action_replicate.py @@ -49,12 +49,12 @@ class Replicate: self.logger = logger def rsync_it(self,from_path,to_path): - from_path = "%s:%s" % (self.host, from_path) + from_path = "%s::%s" % (self.host, from_path) cmd = "rsync -avz %s %s" % (from_path, to_path) rc = utils.subprocess_call(self.logger, cmd, shell=True) if rc !=0: self.logger.info("rsync failed") - + # ------------------------------------------------------- def remove_objects_not_on_master(self, obj_type): @@ -87,7 +87,7 @@ class Replicate: newobj = creator() newobj.from_datastruct(rdata) try: - self.logger.info("adding %s %s" % (obj_type, rdata["name"])) + self.logger.info("adding %s %s" % (obj_type, rdata["name"])) self.api.add_item(obj_type, newobj) except Exception, e: utils.log_exc(self.logger) @@ -99,7 +99,7 @@ class Replicate: remotes = utils.loh_to_hoh(self.remote_data[otype],"uid") for (ruid, rdata) in remotes.iteritems(): - + # do not add the system if it is not on the transfer list if not self.must_include[otype].has_key(rdata["name"]): continue @@ -115,7 +115,7 @@ class Replicate: newobj = creator() newobj.from_datastruct(rdata) try: - self.logger.info("updating %s %s" % (otype, rdata["name"])) + self.logger.info("updating %s %s" % (otype, rdata["name"])) self.api.add_item(otype, newobj) except Exception, e: utils.log_exc(self.logger) @@ -124,9 +124,9 @@ class Replicate: def replicate_data(self): - self.local_data = {} + self.local_data = {} self.remote_data = {} - + self.logger.info("Querying Both Servers") for what in OBJ_TYPES: self.remote_data[what] = self.remote.get_items(what) @@ -140,20 +140,20 @@ class Replicate: if self.prune: self.logger.info("Removing Objects Not Stored On Master") for what in OBJ_TYPES: - self.remove_objects_not_on_master(what) + self.remove_objects_not_on_master(what) else: self.logger.info("*NOT* Removing Objects Not Stored On Master") if not self.omit_data: self.logger.info("Rsyncing trees") - self.rsync_it(os.path.join(self.settings.webdir,"ks_mirror"),self.settings.webdir) + self.rsync_it("cobbler-distros", os.path.join(self.settings.webdir,"ks_mirror") self.logger.info("Rsyncing repos") - self.rsync_it(os.path.join(self.settings.webdir,"repo_mirror"),self.settings.webdir) + self.rsync_it("cobbler-repos", os.path.join(self.settings.webdir,"repo_mirror")) self.logger.info("Rsyncing kickstart templates & snippets") - self.rsync_it("/var/lib/cobbler/kickstarts","/var/lib/cobbler") - self.rsync_it("/var/lib/cobbler/snippets","/var/lib/cobbler") + self.rsync_it("cobbler-kickstarts","/var/lib/cobbler/kickstarts") + self.rsync_it("cobbler-snippets","/var/lib/cobbler/snippets") self.logger.info("Rsyncing triggers") - self.rsync_it("/var/lib/cobbler/triggers","/var/lib/cobbler") + self.rsync_it("cobbler-triggers","/var/lib/cobbler/triggers") else: self.logger.info("*NOT* Rsyncing Data") @@ -173,7 +173,7 @@ class Replicate: for ot in OBJ_TYPES: self.remote_names[ot] = utils.loh_to_hoh(self.remote_data[ot],"name").keys() self.remote_dict[ot] = utils.loh_to_hoh(self.remote_data[ot],"name") - + self.logger.debug("remote names struct is %s" % self.remote_names) self.must_include = { @@ -181,7 +181,7 @@ class Replicate: "profile" : {}, "system" : {}, "image" : {}, - "repo" : {} + "repo" : {} } # include all profiles that are matched by a pattern @@ -203,7 +203,7 @@ class Replicate: if pro != "": self.must_include["profile"][pro] = 1 - # include all profiles that subprofiles require + # include all profiles that subprofiles require # whether they are explicitly included or not # very deep nesting is possible self.logger.debug("* Adding Profiles Required By SubProfiles") @@ -243,7 +243,7 @@ class Replicate: # FIXME: remove debug for ot in OBJ_TYPES: - self.logger.debug("transfer list for %s is %s" % (ot, self.must_include[ot].keys())) + self.logger.debug("transfer list for %s is %s" % (ot, self.must_include[ot].keys())) # ------------------------------------------------------- @@ -276,17 +276,16 @@ class Replicate: else: utils.die('No cobbler master specified, try --master.') - self.logger.info("XMLRPC endpoint: %s" % self.uri) + self.logger.info("XMLRPC endpoint: %s" % self.uri) self.logger.debug("test ALPHA") self.remote = xmlrpclib.Server(self.uri) self.logger.debug("test BETA") self.remote.ping() self.local = xmlrpclib.Server("http://127.0.0.1/cobbler_api") self.local.ping() - + self.replicate_data() self.logger.info("Syncing") self.api.sync() self.logger.info("Done") return True - diff --git a/cobbler/action_sync.py b/cobbler/action_sync.py index 9b741314..efb98723 100644 --- a/cobbler/action_sync.py +++ b/cobbler/action_sync.py @@ -128,6 +128,11 @@ class BootSync: self.dns.regen_hosts() self.dns.write_dns_files() + if self.settings.manage_rsync: + if self.verbose: + self.logger.info("rendering Rsync files") + self.rsync_gen() + if self.verbose: self.logger.info("generating PXE menu structure") self.pxegen.make_pxe_menu() @@ -188,6 +193,38 @@ class BootSync: utils.rmtree_contents(os.path.join(self.bootloc, "ppc"),logger=self.logger) utils.rmtree_contents(os.path.join(self.bootloc, "etc"),logger=self.logger) utils.rmtree_contents(rendered_dir,logger=self.logger) - + + + def rsync_gen(self): + """ + Generate rsync modules of all repositories and distributions + """ + template_file = "/etc/cobbler/rsync.template" + + try: + template = open(template_file,"r") + except: + raise CX(_("error writing template to file: %s") % template_file) + + template_data = "" + template_data = template.read() + template.close() + + distros = [ distro.name for distro in self.api.distros() + if distro.ks_meta.has_key('tree') + and os.path.isdir("/var/www/cobbler/ks_mirror/%s"%distro.name) + ] + repos = [ repo.name for repo in self.api.repos() + if os.path.isdir("/var/www/cobbler/repo_mirror/%s"%repo.name) + ] + + metadata = { + "date" : time.asctime(time.gmtime()), + "cobbler_server" : self.settings.server, + "distros" : distros, + "repos" : repos, + } + + self.templar.render(template_data, metadata, "/etc/rsyncd.conf", None) diff --git a/installer_templates/defaults b/installer_templates/defaults index 3da44762..efa7a6b7 100644 --- a/installer_templates/defaults +++ b/installer_templates/defaults @@ -4,6 +4,7 @@ dns_module: 'manage_bind' dhcp_module: 'manage_isc' enable_dhcp: 0 enable_dns: 0 +enable_rsync: 1 next_server: '127.0.0.1' pxe_once: 0 redhat_management_type: "off" diff --git a/installer_templates/settings.template b/installer_templates/settings.template index 8f5d123c..cf49260c 100644 --- a/installer_templates/settings.template +++ b/installer_templates/settings.template @@ -169,6 +169,9 @@ mgmt_classes: [] mgmt_parameters: from_cobbler: 1 +# set to 1 to enable Cobbler's RSYNC management features. +manage_rsync: $enable_rsync + # set to 1 to enable Cobbler's DHCP management features. # the choice of DHCP management engine is in /etc/cobbler/modules.conf manage_dhcp: $enable_dhcp @@ -237,11 +237,12 @@ if __name__ == "__main__": # seed files for debian (kickpath, ['kickstarts/sample.seed']), - # templates for DHCP, DNS, TFTP + # templates for DHCP, DNS, TFTP, RSYNC (etcpath, ['templates/dhcp.template']), (etcpath, ['templates/dnsmasq.template']), (etcpath, ['templates/named.template']), (etcpath, ['templates/zone.template']), + (etcpath, ['templates/rsync.template']), # templates for netboot configs (pxepath, ['templates/pxedefault.template']), diff --git a/templates/rsync.template b/templates/rsync.template new file mode 100644 index 00000000..b92acffb --- /dev/null +++ b/templates/rsync.template @@ -0,0 +1,43 @@ +# ****************************************************************** +# Cobbler managed rsyncd.conf file +# +# generated from cobbler rsyncd.conf template ($date) +# Do NOT make changes to /etc/rsyncd.conf. Instead, make your changes +# in /etc/cobbler/rsyncd.template, as /etc/rsyncd.conf will be +# overwritten. +# +# ****************************************************************** + +[cobbler-distros] + path = /var/www/cobbler/ks_mirror + comment = All Cobbler Distros + +[cobbler-repos] + path = /var/www/cobbler/repo_mirror + comment = All Cobbler Distros + +[cobbler-kickstarts] + path = /var/lib/cobbler/kickstarts + comment = Cobbler Kickstarts + +[cobbler-snippets] + path = /var/lib/cobbler/snippets + comment = Cobbler Snippets + +[cobbler-triggers] + path = /var/lib/cobbler/triggers + comment = Cobbler Triggers + +#for repo in $repos: +[repo-$repo] + path = /var/www/cobbler/repo_mirror/$repo + comment = Cobbler Repo $repo +#end for + +#for distro in $distros: +[distro-$distro] + path = /var/www/cobbler/ks_mirror/$distro + comment = Cobbler Distro $distro + +#end for + |
