From: Jeff Schroeder jeffschroeder@computer.org
With multiple admins doing changes and building servers or vms in many places it is nice to see whats going on. This patch adds the ability for cobbler to email out reports when new hosts are built. The original idea and smtplib code is from Christopher Johnston. The API code and format string hacks are all me.
Changelog since v1: - Iterate over all availabe interfaces and print their information - Don't use private methods to get network information - Actually make sure this all works against the devel branch - Remove debug prints per mpdehann
An example report (made up) will look like this: Profile: Fedora-10-x86_64
eth2 Hostname: ns1.tra03.int eth2 IP Address: 10.123.234.56 eth2 Mac Address: 0A:31:CA:4D:21:7E eth2 Static: True
eth3 Hostname: ns1-mgmt.tra03.int eth3 IP Address: 192.168.234.56 eth3 Mac Address: 0C:21:5C:4A:31:F2 eth3 Static: True
Kernel Options: ksdevice=bootif console=ttyS0,115200 selinux=0 Templates: /etc/ntp.conf, /etc/snmp/snmpd.conf
Signed-off-By: Jeff Schroeder jeffschroeder@computer.org --- cobbler.spec | 6 ++- cobbler/settings.py | 5 ++ installer_templates/settings.template | 6 ++ setup.py | 2 +- triggers/build_report.trigger | 118 +++++++++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 2 deletions(-) create mode 100755 triggers/build_report.trigger
diff --git a/cobbler.spec b/cobbler.spec index 0f5ac05..5c0ce25 100644 --- a/cobbler.spec +++ b/cobbler.spec @@ -3,7 +3,7 @@ Summary: Boot server configurator Name: cobbler AutoReq: no Version: 1.5.0 -Release: 1%{?dist} +Release: 2%{?dist} Source0: %{name}-%{version}.tar.gz License: GPLv2+ Group: Applications/System @@ -252,6 +252,7 @@ test "x$RPM_BUILD_ROOT" != "x" && rm -rf $RPM_BUILD_ROOT %config(noreplace) /var/lib/cobbler/triggers/install/pre/status_pre.trigger %config(noreplace) /var/lib/cobbler/triggers/install/pre/clear_anamon_logs.trigger %config(noreplace) /var/lib/cobbler/triggers/install/post/status_post.trigger +%config(noreplace) /var/lib/cobbler/triggers/install/post/build_report.trigger
%defattr(664,root,root) %config(noreplace) /etc/cobbler/settings @@ -288,6 +289,9 @@ test "x$RPM_BUILD_ROOT" != "x" && rm -rf $RPM_BUILD_ROOT
%changelog
+* Fri Feb 6 2009 Jeff Schroeder jeffschroeder@computer.org - 1.5.0-2 +- Adding build_report.trigger + * Mon Dec 22 2008 Michael DeHaan mdehaan@redhat.com - 1.5.0-1 - Development release start.
diff --git a/cobbler/settings.py b/cobbler/settings.py index e87536c..e3377e7 100644 --- a/cobbler/settings.py +++ b/cobbler/settings.py @@ -105,6 +105,11 @@ DEFAULTS = { "yumdownloader_flags" : "--resolve", "yumreposync_flags" : "-l", "anamon_enabled" : 0, + "build_reporting" : 0, + "build_reporting_to_address" : "", + "build_reporting_sender" : "", + "build_reporting_subject" : "", + "build_reporting_smtp_server" : "localhost", }
diff --git a/installer_templates/settings.template b/installer_templates/settings.template index 1733b49..3c9f91e 100644 --- a/installer_templates/settings.template +++ b/installer_templates/settings.template @@ -25,6 +25,12 @@ allow_duplicate_macs: 0 # the path to BIND's executable for this distribution. bind_bin: /usr/sbin/named
+# Email out a host report when cobbler finishes building it. +# The sender is optional and this is disabled by default. +build_reporting: 0 +build_reporting_sender: "" +#build_reporting_email: ['emaillist@yourdomain.com', 'bossman@yourdomain.com'] + # Cheetah-language kickstart templates can import Python modules. # while this is a useful feature, it is not safe to allow them to # import anything they want. This whitelists which modules can be diff --git a/setup.py b/setup.py index b31e5fc..e068c08 100644 --- a/setup.py +++ b/setup.py @@ -339,7 +339,7 @@ if __name__ == "__main__": ("%s/delete/repo/post" % trigpath, []), ("%s/delete/repo/post" % trigpath, []), ("%s/install/pre" % trigpath, [ "triggers/status_pre.trigger", "triggers/clear_anamon_logs.trigger"]), - ("%s/install/post" % trigpath, [ "triggers/status_post.trigger"]), + ("%s/install/post" % trigpath, [ "triggers/status_post.trigger", "triggers/build_report.trigger"]), ("%s/sync/pre" % trigpath, []), ("%s/sync/post" % trigpath, [ "triggers/restart-services.trigger" ]) ], diff --git a/triggers/build_report.trigger b/triggers/build_report.trigger new file mode 100755 index 0000000..3bc36be --- /dev/null +++ b/triggers/build_report.trigger @@ -0,0 +1,118 @@ +#!/usr/bin/python + + ############################################################### + # Written 2/3/09 and released under the GNU/GPLv2 ## + # (c) Jeff Schroeder jeffschroeder@computer.org # # +############################################################### # +# # # +# build_report.trigger - Post install trigger for cobbler to # # +# send out a pretty email report that # # +# contains system information. # # +# # # +################################################################ + +import smtplib +from sys import (argv, exit) +from socket import getfqdn +from cobbler import api +cobbler_api = api.BootAPI() +from utils import uniquify +settings = cobbler_api.settings() + +name = argv[2] # name of system or profile +profile = cobbler_api.find_system(name).profile + +# Make this trigger a no-op if host_build_reporting is disabled or if +# it is enabled with no email address configured in the settings file +if not settings.build_reporting: + exit(0) +else: + if not settings.build_reporting_email: + exit(0) + else: + TO = settings.build_reporting_email + +# Add the ability to specify an MTA for servers that don't run their own +if settings.build_reporting_smtp_server: + SERVER = settings.build_reporting_smtp_server +else: + SERVER = "localhost" + +# Use a custom from address or fall back to a reasonable default +if settings.build_reporting_sender: + FROM = settings.build_reporting_sender +else: + FROM = "cobbler@" + getfqdn() + +if not settings.build_reporting_subject: + SUBJECT = 'Cobbler Host Report for [' + name + ']' + +# Show the template files used and unique the list +templates = uniquify(cobbler_api.find_system(name).template_files.values() + + cobbler_api.find_profile(profile).template_files.values() + ) +templates_str = ", ".join(templates) + +# Kernel information +kernel_options_str = "" +system_kopts = cobbler_api.find_system(name).settings.kernel_options +kernel_options = cobbler_api.find_profile(profile).settings.kernel_options + +# System specific kernel options take precedence over profile level ones +kernel_options.update(system_kopts) + +if kernel_options: + for opt in kernel_options: + # You want to know if selinux=0 but don't care as much if lang = ' ' + if (kernel_options[opt] or opt == "selinux") and kernel_options[opt] != ' ': + kernel_options_str += "%s=%s " % (opt, kernel_options[opt]) + +# Network information for all interfaces +network_str = "" +interfaces = cobbler_api.find_system(name).interfaces.keys() + +# People expect eth0 to come before eth1 in a report +interfaces.sort() + +for int in interfaces: + network_info = cobbler_api.find_system(name).interfaces[int] + hostname = network_info['dns_name'] + ip = network_info['ip_address'] + mac = network_info['mac_address'] + static = network_info['static'] + network_str += """ +%20s:\t%s +%20s:\t%s +%20s:\t%s +%20s:\t%s +""" % (int + " Hostname", hostname, + int + " IP Address", ip, + int + " Mac Address", mac, + int + " Static", static + ) + +TEXT = """ +%20s:\t%s +%20s:\t%s +%s +%20s:\t%s +%20s:\t%s +""" % ("Name", name, + "Profile", profile, + network_str, + "Kernel Options", kernel_options_str, + "Templates", templates_str) + +# Prepare actual message +message = """\ +From: %s +To: %s +Subject: %s + +%s +""" % (FROM, ", ".join(TO), SUBJECT, TEXT) + +# Send the mail +server = smtplib.SMTP(SERVER) +server.sendmail(FROM, TO, message) +server.quit()
From: Jeff Schroeder jeffschroeder@computer.org
Signed-off-By: Jeff Schroeder jeffschroeder@computer.org --- AUTHORS | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/AUTHORS b/AUTHORS index 93d239a..7886ea9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -52,6 +52,7 @@ Patches and other contributions from: Adam Rosenwald thestrider@gmail.com Satoru Satoh ssato@redhat.com Scott Seago sseago@redhat.com + Jeff Schroeder jeffschroeder@computer.org Justin Sherill jsherril@redhat.com Anderson Silva ansilva@redhat.com Dylan Swift dylan.swift@gmail.com
jeffschroed@gmail.com wrote:
From: Jeff Schroeder jeffschroeder@computer.org
Signed-off-By: Jeff Schroeder jeffschroeder@computer.org
AUTHORS | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/AUTHORS b/AUTHORS index 93d239a..7886ea9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -52,6 +52,7 @@ Patches and other contributions from: Adam Rosenwald thestrider@gmail.com Satoru Satoh ssato@redhat.com Scott Seago sseago@redhat.com
- Jeff Schroeder jeffschroeder@computer.org Justin Sherill jsherril@redhat.com Anderson Silva ansilva@redhat.com Dylan Swift dylan.swift@gmail.com
IIRC, I haven't applied any patches from you yet into the tree. Will add you once the trigger thing gets merged.
jeffschroed@gmail.com wrote:
From: Jeff Schroeder jeffschroeder@computer.org
With multiple admins doing changes and building servers or vms in many places it is nice to see whats going on. This patch adds the ability for cobbler to email out reports when new hosts are built. The original idea and smtplib code is from Christopher Johnston. The API code and format string hacks are all me.
Changelog since v1: - Iterate over all availabe interfaces and print their information - Don't use private methods to get network information - Actually make sure this all works against the devel branch - Remove debug prints per mpdehann
An example report (made up) will look like this: Profile: Fedora-10-x86_64
eth2 Hostname: ns1.tra03.int eth2 IP Address: 10.123.234.56 eth2 Mac Address: 0A:31:CA:4D:21:7E eth2 Static: True eth3 Hostname: ns1-mgmt.tra03.int eth3 IP Address: 192.168.234.56 eth3 Mac Address: 0C:21:5C:4A:31:F2 eth3 Static: True Kernel Options: ksdevice=bootif console=ttyS0,115200 selinux=0 Templates: /etc/ntp.conf, /etc/snmp/snmpd.conf
Signed-off-By: Jeff Schroeder jeffschroeder@computer.org
cobbler.spec | 6 ++- cobbler/settings.py | 5 ++ installer_templates/settings.template | 6 ++ setup.py | 2 +- triggers/build_report.trigger | 118 +++++++++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 2 deletions(-) create mode 100755 triggers/build_report.trigger
diff --git a/cobbler.spec b/cobbler.spec index 0f5ac05..5c0ce25 100644 --- a/cobbler.spec +++ b/cobbler.spec @@ -3,7 +3,7 @@ Summary: Boot server configurator Name: cobbler AutoReq: no Version: 1.5.0 -Release: 1%{?dist} +Release: 2%{?dist} Source0: %{name}-%{version}.tar.gz License: GPLv2+ Group: Applications/System @@ -252,6 +252,7 @@ test "x$RPM_BUILD_ROOT" != "x" && rm -rf $RPM_BUILD_ROOT %config(noreplace) /var/lib/cobbler/triggers/install/pre/status_pre.trigger %config(noreplace) /var/lib/cobbler/triggers/install/pre/clear_anamon_logs.trigger %config(noreplace) /var/lib/cobbler/triggers/install/post/status_post.trigger +%config(noreplace) /var/lib/cobbler/triggers/install/post/build_report.trigger
%defattr(664,root,root) %config(noreplace) /etc/cobbler/settings @@ -288,6 +289,9 @@ test "x$RPM_BUILD_ROOT" != "x" && rm -rf $RPM_BUILD_ROOT
%changelog
+* Fri Feb 6 2009 Jeff Schroeder jeffschroeder@computer.org - 1.5.0-2 +- Adding build_report.trigger
- Mon Dec 22 2008 Michael DeHaan mdehaan@redhat.com - 1.5.0-1
- Development release start.
diff --git a/cobbler/settings.py b/cobbler/settings.py index e87536c..e3377e7 100644 --- a/cobbler/settings.py +++ b/cobbler/settings.py @@ -105,6 +105,11 @@ DEFAULTS = { "yumdownloader_flags" : "--resolve", "yumreposync_flags" : "-l", "anamon_enabled" : 0,
- "build_reporting" : 0,
- "build_reporting_to_address" : "",
- "build_reporting_sender" : "",
- "build_reporting_subject" : "",
- "build_reporting_smtp_server" : "localhost",
}
diff --git a/installer_templates/settings.template b/installer_templates/settings.template index 1733b49..3c9f91e 100644 --- a/installer_templates/settings.template +++ b/installer_templates/settings.template @@ -25,6 +25,12 @@ allow_duplicate_macs: 0 # the path to BIND's executable for this distribution. bind_bin: /usr/sbin/named
+# Email out a host report when cobbler finishes building it. +# The sender is optional and this is disabled by default. +build_reporting: 0 +build_reporting_sender: "" +#build_reporting_email: ['emaillist@yourdomain.com', 'bossman@yourdomain.com']
# Cheetah-language kickstart templates can import Python modules. # while this is a useful feature, it is not safe to allow them to # import anything they want. This whitelists which modules can be diff --git a/setup.py b/setup.py index b31e5fc..e068c08 100644 --- a/setup.py +++ b/setup.py @@ -339,7 +339,7 @@ if __name__ == "__main__": ("%s/delete/repo/post" % trigpath, []), ("%s/delete/repo/post" % trigpath, []), ("%s/install/pre" % trigpath, [ "triggers/status_pre.trigger", "triggers/clear_anamon_logs.trigger"]),
("%s/install/post" % trigpath, [ "triggers/status_post.trigger"]),
("%s/install/post" % trigpath, [ "triggers/status_post.trigger", "triggers/build_report.trigger"]), ("%s/sync/pre" % trigpath, []), ("%s/sync/post" % trigpath, [ "triggers/restart-services.trigger" ]) ],
diff --git a/triggers/build_report.trigger b/triggers/build_report.trigger new file mode 100755 index 0000000..3bc36be --- /dev/null +++ b/triggers/build_report.trigger @@ -0,0 +1,118 @@ +#!/usr/bin/python
- ###############################################################
- # Written 2/3/09 and released under the GNU/GPLv2 ##
- # (c) Jeff Schroeder jeffschroeder@computer.org # #
+############################################################### # +# # # +# build_report.trigger - Post install trigger for cobbler to # # +# send out a pretty email report that # # +# contains system information. # # +# # # +################################################################
+import smtplib +from sys import (argv, exit) +from socket import getfqdn +from cobbler import api +cobbler_api = api.BootAPI() +from utils import uniquify +settings = cobbler_api.settings()
+name = argv[2] # name of system or profile +profile = cobbler_api.find_system(name).profile
+# Make this trigger a no-op if host_build_reporting is disabled or if +# it is enabled with no email address configured in the settings file +if not settings.build_reporting:
- exit(0)
+else:
- if not settings.build_reporting_email:
exit(0)
- else:
TO = settings.build_reporting_email
+# Add the ability to specify an MTA for servers that don't run their own +if settings.build_reporting_smtp_server:
- SERVER = settings.build_reporting_smtp_server
+else:
- SERVER = "localhost"
+# Use a custom from address or fall back to a reasonable default +if settings.build_reporting_sender:
- FROM = settings.build_reporting_sender
+else:
- FROM = "cobbler@" + getfqdn()
+if not settings.build_reporting_subject:
- SUBJECT = 'Cobbler Host Report for [' + name + ']'
+# Show the template files used and unique the list +templates = uniquify(cobbler_api.find_system(name).template_files.values() +
cobbler_api.find_profile(profile).template_files.values()
)
+templates_str = ", ".join(templates)
+# Kernel information +kernel_options_str = "" +system_kopts = cobbler_api.find_system(name).settings.kernel_options +kernel_options = cobbler_api.find_profile(profile).settings.kernel_options
+# System specific kernel options take precedence over profile level ones +kernel_options.update(system_kopts)
+if kernel_options:
- for opt in kernel_options:
# You want to know if selinux=0 but don't care as much if lang = ' '
if (kernel_options[opt] or opt == "selinux") and kernel_options[opt] != ' ':
kernel_options_str += "%s=%s " % (opt, kernel_options[opt])
+# Network information for all interfaces +network_str = "" +interfaces = cobbler_api.find_system(name).interfaces.keys()
+# People expect eth0 to come before eth1 in a report +interfaces.sort()
+for int in interfaces:
- network_info = cobbler_api.find_system(name).interfaces[int]
- hostname = network_info['dns_name']
- ip = network_info['ip_address']
- mac = network_info['mac_address']
- static = network_info['static']
- network_str += """
+%20s:\t%s +%20s:\t%s +%20s:\t%s +%20s:\t%s +""" % (int + " Hostname", hostname,
int + " IP Address", ip,
int + " Mac Address", mac,
int + " Static", static
)
+TEXT = """ +%20s:\t%s +%20s:\t%s +%s +%20s:\t%s +%20s:\t%s +""" % ("Name", name,
"Profile", profile,
network_str,
"Kernel Options", kernel_options_str,
"Templates", templates_str)
+# Prepare actual message +message = """\ +From: %s +To: %s +Subject: %s
+%s +""" % (FROM, ", ".join(TO), SUBJECT, TEXT)
+# Send the mail +server = smtplib.SMTP(SERVER) +server.sendmail(FROM, TO, message) +server.quit()
Can we make this use a Cheetah template? If so, users could customize what they wanted to have in the report. (See templar.py, and various code that references it).
--Michael
jeffschroed@gmail.com wrote:
From: Jeff Schroeder jeffschroeder@computer.org
With multiple admins doing changes and building servers or vms in many places it is nice to see whats going on. This patch adds the ability for cobbler to email out reports when new hosts are built. The original idea and smtplib code is from Christopher Johnston. The API code and format string hacks are all me.
... snip ...
I've applied this with several modifications to upgrade it. That all being said, the original was pretty awesome.
What I've changed is to:
(A) use xmlrpc instead of a cobbler API handle. Starting a new cobbler API handle during a fork with a very large system config would have been a /HUGE/ performance load, and doing this when 300 systems reinstall at once would be crazy harsh.
(B) I've made this a Cheetah template.
I'll explain more in a 2nd email so people will read it and not think it's a patch thread :)
Very cool, thanks.
--Michael
cobbler@lists.fedorahosted.org