summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorScott Henson <shenson@redhat.com>2009-08-19 21:17:29 -0400
committerScott Henson <shenson@redhat.com>2009-08-21 16:54:34 -0400
commit60fe75a5f557c2045bc6b71f9cb12693e8fb22f2 (patch)
treeb9171e86a418a1932854c2c6d7e256079e36ae82
parent80766507dceaf68b2a6d4a6083d3f2bfa48a6a4a (diff)
downloadcobbler-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--Makefile2
-rw-r--r--cobbler/action_check.py15
-rw-r--r--cobbler/action_replicate.py39
-rw-r--r--cobbler/action_sync.py39
-rw-r--r--installer_templates/defaults1
-rw-r--r--installer_templates/settings.template3
-rw-r--r--setup.py3
-rw-r--r--templates/rsync.template43
8 files changed, 123 insertions, 22 deletions
diff --git a/Makefile b/Makefile
index 841598ab..fe80d326 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/setup.py b/setup.py
index 1c340836..ce5ed9b1 100644
--- a/setup.py
+++ b/setup.py
@@ -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
+