diff options
Diffstat (limited to 'cobbler/action_report.py')
-rw-r--r-- | cobbler/action_report.py | 365 |
1 files changed, 365 insertions, 0 deletions
diff --git a/cobbler/action_report.py b/cobbler/action_report.py new file mode 100644 index 00000000..2288433e --- /dev/null +++ b/cobbler/action_report.py @@ -0,0 +1,365 @@ +""" +Report from a cobbler master. + +Copyright 2007-2008, Red Hat, Inc +Anderson Silva <ansilva@redhat.com> + + +This software may be freely redistributed under the terms of the GNU +general public license. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +""" + +import os +import os.path +import xmlrpclib +import api as cobbler_api +from cexceptions import * +from utils import _ + + +class Report: + + def __init__(self, config): + """ + Constructor + """ + self.config = config + self.settings = config.settings() + self.api = config.api + self.report_type = None + self.report_what = None + self.report_name = None + self.report_fields = None + self.report_noheaders = None + + def reporting_csv(self, info, order, noheaders): + """ + Formats data on 'info' for csv output + """ + outputheaders = '' + outputbody = '' + sep = ',' + + info_count = 0 + for item in info: + + item_count = 0 + for key in order: + + if info_count == 0: + outputheaders += str(key) + sep + + outputbody += str(item[key]) + sep + + item_count = item_count + 1 + + info_count = info_count + 1 + outputbody += '\n' + + outputheaders += '\n' + + if noheaders: + outputheaders = ''; + + return outputheaders + outputbody + + def reporting_trac(self, info, order, noheaders): + """ + Formats data on 'info' for trac wiki table output + """ + outputheaders = '' + outputbody = '' + sep = '||' + + info_count = 0 + for item in info: + + item_count = 0 + for key in order: + + + if info_count == 0: + outputheaders += sep + str(key) + + outputbody += sep + str(item[key]) + + item_count = item_count + 1 + + info_count = info_count + 1 + outputbody += '||\n' + + outputheaders += '||\n' + + if noheaders: + outputheaders = ''; + + return outputheaders + outputbody + + def reporting_doku(self, info, order, noheaders): + """ + Formats data on 'info' for doku wiki table output + """ + outputheaders = '' + outputbody = '' + sep1 = '^' + sep2 = '|' + + + info_count = 0 + for item in info: + + item_count = 0 + for key in order: + + if info_count == 0: + outputheaders += sep1 + key + + outputbody += sep2 + item[key] + + item_count = item_count + 1 + + info_count = info_count + 1 + outputbody += sep2 + '\n' + + outputheaders += sep1 + '\n' + + if noheaders: + outputheaders = ''; + + return outputheaders + outputbody + + def reporting_mediawiki(self, info, order, noheaders): + """ + Formats data on 'info' for mediawiki table output + """ + outputheaders = '' + outputbody = '' + opentable = '{| border="1"\n' + closetable = '|}\n' + sep1 = '||' + sep2 = '|' + sep3 = '|-' + + + info_count = 0 + for item in info: + + item_count = 0 + for key in order: + + if info_count == 0 and item_count == 0: + outputheaders += sep2 + key + elif info_count == 0: + outputheaders += sep1 + key + + if item_count == 0: + outputbody += sep2 + str(item[key]) + else: + outputbody += sep1 + str(item[key]) + + item_count = item_count + 1 + + info_count = info_count + 1 + outputbody += '\n' + sep3 + '\n' + + outputheaders += '\n' + sep3 + '\n' + + if noheaders: + outputheaders = ''; + + return opentable + outputheaders + outputbody + closetable + + def print_formatted_data(self, data, order, report_type, noheaders): + """ + Used for picking the correct format to output data as + """ + if report_type == "csv": + print self.reporting_csv(data, order, noheaders) + if report_type == "mediawiki": + print self.reporting_mediawiki(data, order, noheaders) + if report_type == "trac": + print self.reporting_trac(data, order, noheaders) + if report_type == "doku": + print self.reporting_doku(data, order, noheaders) + + return True + + def reporting_sorter(self, a, b): + """ + Used for sorting cobbler objects for report commands + """ + return cmp(a.name, b.name) + + def reporting_print_sorted(self, collection): + """ + Prints all objects in a collection sorted by name + """ + collection = [x for x in collection] + collection.sort(self.reporting_sorter) + for x in collection: + print x.printable() + return True + + def reporting_list_names2(self, collection, name): + """ + Prints a specific object in a collection. + """ + obj = collection.find(name=name) + if obj is not None: + print obj.printable() + return True + + def reporting_print_all_fields(self, collection, report_type, report_noheaders): + """ + Prints all fields in a collection as a table given the report type + """ + collection = [x for x in collection] + collection.sort(self.reporting_sorter) + data = [] + out_order = [] + count = 0 + for x in collection: + item = {} + structure = x.to_datastruct() + + for (key, value) in structure.iteritems(): + + # exception for systems which could have > 1 interface + if key == "interfaces": + for (device, info) in value.iteritems(): + for (info_header, info_value) in info.iteritems(): + item[info_header] = str(device) + ': ' + str(info_value) + # needs to create order list for print_formatted_fields + if count == 0: + out_order.append(info_header) + else: + item[key] = value + # needs to create order list for print_formatted_fields + if count == 0: + out_order.append(key) + + count = count + 1 + + data.append(item) + + self.print_formatted_data(data = data, order = out_order, report_type = report_type, noheaders = report_noheaders) + + return True + + def reporting_print_x_fields(self, collection, report_type, report_fields, report_noheaders): + """ + Prints specific fields in a collection as a table given the report type + """ + collection = [x for x in collection] + collection.sort(self.reporting_sorter) + data = [] + fields_list = report_fields.replace(' ', '').split(',') + + for x in collection: + structure = x.to_datastruct() + item = {} + for field in fields_list: + + if field in structure.keys(): + item[field] = structure[field] + + # exception for systems which could have > 1 interface + elif "interfaces" in structure.keys(): + for device in structure['interfaces'].keys(): + if field in structure['interfaces'][device]: + item[field] = device + ': ' + structure['interfaces'][device][field] + else: + raise CX(_("The field %s does not exist, see cobbler dumpvars for available fields.") % field) + + data.append(item) + + self.print_formatted_data(data = data, order = fields_list, report_type = report_type, noheaders = report_noheaders) + + return True + + # ------------------------------------------------------- + + def run(self, report_what = None, report_name = None, report_type = None, report_fields = None, report_noheaders = None): + """ + Get remote profiles and distros and sync them locally + """ + + """ + 1. Handles original report output + 2. Handles all fields of report outputs as table given a format + 3. Handles specific fields of report outputs as table given a format + """ + + + if report_type == 'text' and report_fields == 'all': + + if report_what in [ "all", "distros", "distro" ]: + if report_name: + self.reporting_list_names2(self.api.distros(), report_name) + else: + self.reporting_print_sorted(self.api.distros()) + + if report_what in [ "all", "profiles", "profile" ]: + if report_name: + self.reporting_list_names2(self.api.profiles(), report_name) + else: + self.reporting_print_sorted(self.api.profiles()) + + if report_what in [ "all", "systems", "system" ]: + if report_name: + self.reporting_list_names2(self.api.systems(), report_name) + else: + self.reporting_print_sorted(self.api.systems()) + + if report_what in [ "all", "repos", "repo" ]: + if report_name is not None: + self.reporting_list_names2(self.api.repos(), report_name) + else: + self.reporting_print_sorted(self.api.repos()) + + if report_what in [ "all", "images", "image" ]: + if report_name is not None: + self.reporting_list_names2(self.api.images(), report_name) + else: + self.reporting_print_sorted(self.api.images()) + + elif report_type == 'text' and report_fields != 'all': + raise CX(_("The 'text' type can only be used with field set to 'all'")) + + elif report_type != 'text' and report_fields == 'all': + + if report_what in [ "all", "distros", "distro" ]: + self.reporting_print_all_fields(self.api.distros(), report_type, report_noheaders) + + if report_what in [ "all", "profiles", "profile" ]: + self.reporting_print_all_fields(self.api.profiles(), report_type, report_noheaders) + + if report_what in [ "all", "systems", "system" ]: + self.reporting_print_all_fields(self.api.systems(), report_type, report_noheaders) + + if report_what in [ "all", "repos", "repo" ]: + self.reporting_print_all_fields(self.api.repos(), report_type, report_noheaders) + + if report_what in [ "all", "images", "image" ]: + self.reporting_print_all_fields(self.api.images(), report_type, report_noheaders) + + else: + + if report_what in [ "all", "distros", "distro" ]: + self.reporting_print_x_fields(self.api.distros(), report_type, report_fields, report_noheaders) + + if report_what in [ "all", "profiles", "profile" ]: + self.reporting_print_x_fields(self.api.profiles(), report_type, report_fields, report_noheaders) + + if report_what in [ "all", "systems", "system" ]: + self.reporting_print_x_fields(self.api.systems(), report_type, report_fields, report_noheaders) + + if report_what in [ "all", "repos", "repo" ]: + self.reporting_print_x_fields(self.api.repos(), report_type, report_fields, report_noheaders) + if report_what in [ "all", "images", "image" ]: + self.reporting_print_x_fields(self.api.images(), report_type, report_fields, report_noheaders) + |