Example #1
0
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)
Example #2
0
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)