def mass_delete(cls, pathname_list, user, delete_pkgs=False): '''Deletes pkginfo files from a list and optionally deletes the associated installer items (pkgs)''' errors = [] catalog_items = [] if delete_pkgs: # cache the catalog_items once; we don't want to incur the # overhead of reading the 'all' catalog multiple times catalog_items = Catalog.detail('all') for pathname in pathname_list: delete_this_pkg = False if delete_pkgs: ref_count, pkg_path = pkg_ref_count(pathname, catalog_items) if ref_count == 1: # OK to delete the pkg if there is only one pkginfo # file that refers to it delete_this_pkg = True try: cls.delete('pkgsinfo', pathname, user) except FileDeleteError, err: errors.append('Error %s when removing %s' % (err, pathname)) else: if delete_this_pkg: try: MunkiFile.delete('pkgs', pkg_path, user) except FileDeleteError, err: errors.append('Error %s when removing %s' % (err, pkg_path))
def DEFUNCT_get_install_item_names(cls, manifest_name): '''Returns a dictionary containing types of install items valid for the current manifest''' suggested_set = set() update_set = set() versioned_set = set() manifest = read_manifest(manifest_name) if manifest: catalog_list = manifest.get('catalogs', ['all']) for catalog in catalog_list: catalog_items = Catalog.detail(catalog) if catalog_items: suggested_names = list(set( [item['name'] for item in catalog_items if not item.get('update_for')])) suggested_set.update(suggested_names) update_names = list(set( [item['name'] for item in catalog_items if item.get('update_for')])) update_set.update(update_names) item_names_with_versions = list(set( [item['name'] + '-' + trim_version_string(item['version']) for item in catalog_items])) versioned_set.update(item_names_with_versions) return {'suggested': list(suggested_set), 'updates': list(update_set), 'with_version': list(versioned_set)}
def getInstallItemNames(cls, manifest_name): '''Returns a dictionary containing types of install items valid for the current manifest''' suggested_set = set() update_set = set() versioned_set = set() manifest = cls.read(manifest_name) if manifest: if settings.ALL_ITEMS: catalog_list = ['all'] else: catalog_list = manifest.get('catalogs', ['all']) for catalog in catalog_list: catalog_items = Catalog.detail(catalog) if catalog_items: suggested_names = list(set( [item['name'] for item in catalog_items if not item.get('update_for')])) suggested_set.update(suggested_names) update_names = list(set( [item['name'] for item in catalog_items if item.get('update_for')])) update_set.update(update_names) item_names_with_versions = list(set( [item['name'] + '-' + trimVersionString(item['version']) for item in catalog_items])) versioned_set.update(item_names_with_versions) return {'suggested': list(suggested_set), 'updates': list(update_set), 'with_version': list(versioned_set)}
def mass_delete(cls, pathname_list, user, delete_pkgs=False): '''Deletes pkginfo files from a list and optionally deletes the associated installer items (pkgs)''' errors = [] catalog_items = [] if delete_pkgs: # cache the catalog_items once; we don't want to incur the # overhead of reading the 'all' catalog multiple times catalog_items = Catalog.detail('all') for pathname in pathname_list: delete_this_pkg = False if delete_pkgs: ref_count, pkg_path = pkg_ref_count(pathname, catalog_items) if ref_count == 1: # OK to delete the pkg if there is only one pkginfo # file that refers to it delete_this_pkg = True try: cls.delete('pkgsinfo', pathname, user) except FileDeleteError, err: errors.append('Error %s when removing %s' % (err, pathname)) else: if delete_this_pkg: try: MunkiFile.delete('pkgs', pkg_path, user) except FileDeleteError, err: errors.append('Error %s when removing %s' % (err, pkg_path))
def get_packagenamelist(): catalogs = Catalog() package_details = [] for cat in catalogs.list(): package_details = package_details + catalogs.detail(cat) package_list = list( set( [ pkg['name'] for pkg in package_details] ) ) return package_list
def getSuggestedInstallItems(cls, manifest_name): '''Returns a list of suggested install item names for the given manifest, taking into account the current list of catalogs, and filtering out updates and versions.''' install_items = [] manifest = cls.read(manifest_name) if manifest: catalog_list = manifest.get('catalogs', []) for catalog in catalog_list: catalog_items = Catalog.detail(catalog) install_items = list(set( [item['name'] for item in catalog_items if not item.get('update_for')])) return install_items
def getSuggestedInstallItems(cls, manifest_name): '''Returns a list of suggested install item names for the given manifest, taking into account the current list of catalogs, and filtering out updates and versions.''' install_items = [] manifest = cls.read(manifest_name) if manifest: catalog_list = manifest.get('catalogs', []) for catalog in catalog_list: catalog_items = Catalog.detail(catalog) install_items = list( set([ item['name'] for item in catalog_items if not item.get('update_for') ])) return install_items
def getValidInstallItems(cls, manifest_name): '''Returns a list of valid install item names for the given manifest, taking into account the current list of catalogs''' manifest = cls.read(manifest_name) if manifest: catalog_list = manifest.get('catalogs', []) install_items = set() for catalog in catalog_list: catalog_items = Catalog.detail(catalog) if catalog_items: catalog_item_names = list(set( [item['name'] for item in catalog_items])) install_items.update(catalog_item_names) catalog_item_names_with_versions = list(set( [item['name'] + '-' + trimVersionString(item['version']) for item in catalog_items])) install_items.update(catalog_item_names_with_versions) return list(install_items) return []
def getInstallItemNames(cls, manifest_name): '''Returns a dictionary containing types of install items valid for the current manifest''' suggested_set = set() update_set = set() versioned_set = set() manifest = cls.read(manifest_name) if manifest: if ALL_ITEMS: catalog_list = ['all'] else: catalog_list = manifest.get('catalogs', ['all']) for catalog in catalog_list: catalog_items = Catalog.detail(catalog) if catalog_items: suggested_names = list( set([ item['name'] for item in catalog_items if not item.get('update_for') ])) suggested_set.update(suggested_names) update_names = list( set([ item['name'] for item in catalog_items if item.get('update_for') ])) update_set.update(update_names) item_names_with_versions = list( set([ item['name'] + '-' + trimVersionString(item['version']) for item in catalog_items ])) versioned_set.update(item_names_with_versions) return { 'suggested': list(suggested_set), 'updates': list(update_set), 'with_version': list(versioned_set) }
def getValidInstallItems(cls, manifest_name): '''Returns a list of valid install item names for the given manifest, taking into account the current list of catalogs''' manifest = cls.read(manifest_name) if manifest: catalog_list = manifest.get('catalogs', []) install_items = set() for catalog in catalog_list: catalog_items = Catalog.detail(catalog) if catalog_items: catalog_item_names = list( set([item['name'] for item in catalog_items])) install_items.update(catalog_item_names) catalog_item_names_with_versions = list( set([ item['name'] + '-' + trimVersionString(item['version']) for item in catalog_items ])) install_items.update(catalog_item_names_with_versions) return list(install_items) return []
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)