def detail_pkg(request, serial, manifest_name): machine = None manifest = None install_items = None if serial: try: machine = Machine.objects.get(serial_number=serial) except Machine.DoesNotExist: raise Http404 else: raise Http404 report_plist = {} if machine: try: report = MunkiReport.objects.get(machine=machine) report_plist = report.get_report() except MunkiReport.DoesNotExist: pass # get autocomplete data install_items = Manifest.getInstallItemNames(manifest_name) valid_install_items = install_items["suggested"] + install_items["updates"] + install_items["with_version"] suggested_install_items = install_items["suggested"] valid_catalogs = Catalog.list() valid_manifest_names = Manifest.list() autocomplete_data = json.dumps( {"items": install_items["suggested"], "catalogs": valid_catalogs, "manifests": valid_manifest_names} ) # loop trought includet manifests as long as it have one includetManifests = dict() def get_addition_manifests(manifest): detailManifest = Manifest.read(manifest) includetManifests.update({manifest: detailManifest}) if "included_manifests" in detailManifest: for includetManifest in detailManifest.included_manifests: get_addition_manifests(includetManifest) manifest = Manifest.read(manifest_name) sorted_Manifests = SortedDict() sorted_Manifests[manifest_name] = manifest if "included_manifests" in manifest: for includetManifest in manifest.included_manifests: get_addition_manifests(includetManifest) sort_list = manifest.included_manifests for key in sort_list: sorted_Manifests[key] = includetManifests[key] key_list = includetManifests.keys() key_list.sort() for key in key_list: if key not in sorted_Manifests: sorted_Manifests[key] = includetManifests[key] # item_details -> list with software and details # true_items for check if a software is in catalog or not item_details = {} true_items = list() if "catalogs" in manifest: for catalog in manifest.catalogs: catalog_detail = Catalog.detail(catalog) if catalog_detail: for detail in reversed(catalog_detail): if not detail.name in item_details: item_details[detail.name] = detail true_items.append(detail.name) if "icon_name" in item_details[detail.name]: icon = Catalog.get_icon(item_details[detail.name].icon_name) else: icon = Catalog.get_icon(detail.name) item_details[detail.name].icon_name = icon ManagedInstallsDetail = SortedDict() if report_plist.has_key("ManagedInstalls"): for item in report_plist.ManagedInstalls: ManagedInstallsDetail[item.name] = item # installs installs = SortedDict() listed = list() installsTypes = ["managed_installs", "managed_uninstalls", "optional_installs"] for installsType in installsTypes: installs[installsType] = SortedDict() for number, manifests in enumerate(sorted_Manifests): installs[installsType][manifests] = SortedDict() if manifest: for index, item in enumerate(sorted_Manifests[manifests][installsType]): listed.append(item) if ManagedInstallsDetail.has_key(item): installs[installsType][manifests][item] = ManagedInstallsDetail[item] if item in true_items: if installs[installsType].get(manifests, {}).has_key(item): installs[installsType][manifests][item].update(item_details[item]) else: installs[installsType][manifests][item] = item_details[item] installs[installsType][manifests][item].update({"incatalog": "True"}) else: if installs[installsType].get(manifests, {}).has_key(item): installs[installsType][manifests][item].update({"incatalog": "False"}) else: installs[installsType][manifests][item] = {"name": item, "incatalog": "False"} required = SortedDict() for item in sorted(ManagedInstallsDetail.items(), key=lambda x: x[1]["display_name"]): if not item[0] in listed: if item_details.has_key(item[0]): ManagedInstallsDetail[item[0]].icon_name = item_details[item[0]].icon_name else: ManagedInstallsDetail[item[0]].icon_name = "/static/img/PackageIcon.png" required[item[0]] = ManagedInstallsDetail[item[0]] # handle items that were installed during the most recent run install_results = {} for result in report_plist.get("InstallResults", []): nameAndVers = result["name"] + "-" + result["version"] if result["status"] == 0: install_results[nameAndVers] = "installed" else: install_results[nameAndVers] = "error" if install_results: for item in report_plist.get("ItemsToInstall", []): name = item.get("display_name", item["name"]) nameAndVers = "%s-%s" % (name, item["version_to_install"]) item["install_result"] = install_results.get(nameAndVers, "pending") for item in report_plist.get("ManagedInstalls", []): if "version_to_install" in item: name = item.get("display_name", item["name"]) nameAndVers = "%s-%s" % (name, item["version_to_install"]) if install_results.get(nameAndVers) == "installed": item["installed"] = True # handle items that were removed during the most recent run # this is crappy. We should fix it in Munki. removal_results = {} # for result in report_plist.get('RemovalResults', []): # m = re.search('^Removal of (.+): (.+)$', result) # if m: # try: # if m.group(2) == 'SUCCESSFUL': # removal_results[m.group(1)] = 'removed' # else: # removal_results[m.group(1)] = m.group(2) # except IndexError: # pass if removal_results: for item in report_plist.get("ItemsToRemove", []): name = item.get("display_name", item["name"]) item["install_result"] = removal_results.get(name, "pending") if item["install_result"] == "removed": if not "RemovedItems" in report_plist: report_plist["RemovedItems"] = [item["name"]] elif not name in report_plist["RemovedItems"]: report_plist["RemovedItems"].append(item["name"]) c = RequestContext( request, { "manifest_name": manifest_name, "manifest": manifest, "report": report_plist, "installs": installs, "autocomplete_data": autocomplete_data, "required": required, "valid_manifest_names": valid_manifest_names, "valid_catalogs": valid_catalogs, }, ) c.update(csrf(request)) return render_to_response("reports/detail_pkg.html", c)
def detail_pkg(request, serial, manifest_name): machine = None manifest = None install_items = None if serial: try: machine = Machine.objects.get(serial_number=serial) except Machine.DoesNotExist: raise Http404 else: raise Http404 report_plist = {} if machine: try: report = MunkiReport.objects.get(machine=machine) report_plist = report.get_report() except MunkiReport.DoesNotExist: pass # get autocomplete data install_items = Manifest.getInstallItemNames(manifest_name) valid_install_items = (install_items['suggested'] + install_items['updates'] + install_items['with_version']) suggested_install_items = install_items['suggested'] valid_catalogs = Catalog.list() valid_manifest_names = Manifest.list() autocomplete_data = json.dumps({ 'items': install_items['suggested'], 'catalogs': valid_catalogs, 'manifests': valid_manifest_names }) # loop trought includet manifests as long as it have one includetManifests = dict() def get_addition_manifests(manifest): detailManifest = Manifest.read(manifest) includetManifests.update({manifest: detailManifest}) if "included_manifests" in detailManifest: for includetManifest in detailManifest.included_manifests: get_addition_manifests(includetManifest) manifest = Manifest.read(manifest_name) sorted_Manifests = SortedDict() sorted_Manifests[manifest_name] = manifest if "included_manifests" in manifest: for includetManifest in manifest.included_manifests: get_addition_manifests(includetManifest) sort_list = manifest.included_manifests for key in sort_list: sorted_Manifests[key] = includetManifests[key] key_list = includetManifests.keys() key_list.sort() for key in key_list: if key not in sorted_Manifests: sorted_Manifests[key] = includetManifests[key] # item_details -> list with software and details # true_items for check if a software is in catalog or not item_details = {} true_items = list() if "catalogs" in manifest: for catalog in manifest.catalogs: catalog_detail = Catalog.detail(catalog) if catalog_detail: for detail in reversed(catalog_detail): if not detail.name in item_details: item_details[detail.name] = detail true_items.append(detail.name) if "icon_name" in item_details[detail.name]: icon = Catalog.get_icon( item_details[detail.name].icon_name) else: icon = Catalog.get_icon(detail.name) item_details[detail.name].icon_name = icon ManagedInstallsDetail = SortedDict() if report_plist.has_key("ManagedInstalls"): for item in report_plist.ManagedInstalls: ManagedInstallsDetail[item.name] = item # installs installs = SortedDict() listed = list() installsTypes = [ "managed_installs", "managed_uninstalls", "optional_installs" ] for installsType in installsTypes: installs[installsType] = SortedDict() for number, manifests in enumerate(sorted_Manifests): installs[installsType][manifests] = SortedDict() if manifest: for index, item in enumerate( sorted_Manifests[manifests][installsType]): listed.append(item) if ManagedInstallsDetail.has_key(item): installs[installsType][manifests][ item] = ManagedInstallsDetail[item] if item in true_items: if installs[installsType].get(manifests, {}).has_key(item): installs[installsType][manifests][item].update( item_details[item]) else: installs[installsType][manifests][ item] = item_details[item] installs[installsType][manifests][item].update( {"incatalog": "True"}) else: if installs[installsType].get(manifests, {}).has_key(item): installs[installsType][manifests][item].update( {"incatalog": "False"}) else: installs[installsType][manifests][item] = { 'name': item, "incatalog": "False" } required = SortedDict() for item in sorted(ManagedInstallsDetail.items(), key=lambda x: x[1]['display_name']): if not item[0] in listed: if item_details.has_key(item[0]): ManagedInstallsDetail[item[0]].icon_name = item_details[ item[0]].icon_name else: ManagedInstallsDetail[ item[0]].icon_name = "/static/img/PackageIcon.png" required[item[0]] = ManagedInstallsDetail[item[0]] # handle items that were installed during the most recent run install_results = {} for result in report_plist.get('InstallResults', []): nameAndVers = result['name'] + '-' + result['version'] if result['status'] == 0: install_results[nameAndVers] = "installed" else: install_results[nameAndVers] = 'error' if install_results: for item in report_plist.get('ItemsToInstall', []): name = item.get('display_name', item['name']) nameAndVers = ('%s-%s' % (name, item['version_to_install'])) item['install_result'] = install_results.get( nameAndVers, 'pending') for item in report_plist.get('ManagedInstalls', []): if 'version_to_install' in item: name = item.get('display_name', item['name']) nameAndVers = ('%s-%s' % (name, item['version_to_install'])) if install_results.get(nameAndVers) == 'installed': item['installed'] = True # handle items that were removed during the most recent run # this is crappy. We should fix it in Munki. removal_results = {} # for result in report_plist.get('RemovalResults', []): # m = re.search('^Removal of (.+): (.+)$', result) # if m: # try: # if m.group(2) == 'SUCCESSFUL': # removal_results[m.group(1)] = 'removed' # else: # removal_results[m.group(1)] = m.group(2) # except IndexError: # pass if removal_results: for item in report_plist.get('ItemsToRemove', []): name = item.get('display_name', item['name']) item['install_result'] = removal_results.get(name, 'pending') if item['install_result'] == 'removed': if not 'RemovedItems' in report_plist: report_plist['RemovedItems'] = [item['name']] elif not name in report_plist['RemovedItems']: report_plist['RemovedItems'].append(item['name']) c = RequestContext( request, { 'manifest_name': manifest_name, 'manifest': manifest, 'report': report_plist, 'installs': installs, 'autocomplete_data': autocomplete_data, 'required': required, 'valid_manifest_names': valid_manifest_names, 'valid_catalogs': valid_catalogs, }) c.update(csrf(request)) return render_to_response('reports/detail_pkg.html', c)