Metadata-Version: 2.4
Name: jamf-resource-deleter
Version: 0.4.0
Summary: A module that reads JSON files of Jamf resources (IDs) and deletes them
Author-email: Gordon Deacon <gdeacon99@gmail.com>
License: Apache 2.0
Project-URL: Homepage, https://github.com/macdeacon99/jamfpro-resource-deleter
Classifier: Programming Language :: Python :: 3
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: requests>=2.31.0
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Requires-Dist: ruff; extra == "dev"
Requires-Dist: mypy; extra == "dev"
Requires-Dist: bandit; extra == "dev"
Requires-Dist: build; extra == "dev"
Dynamic: license-file

# Jamf Resource Deleter

Safely delete unused or disabled resources from **Jamf Pro** using structured JSON input and the Jamf Pro API.

This tool is designed to work alongside tools like **Prune**, allowing you to identify unused Jamf resources, export them as JSON, and then **programmatically remove them** from your Jamf Pro tenant.

---

## ⚠️ Warning

This tool **permanently deletes Jamf Pro resources**.

- There is **no undo**
- Always validate your JSON input
- Always test against a **non-production Jamf tenant first**
- Review the resources to be deleted before running

You are responsible for the changes made by this tool.

---

## Features

- Deletes unused or disabled Jamf Pro resources via API
- Supports **multiple JSON input files**
- Clear naming conventions and predictable behavior
- Uses the [JamfPy Python SDK](https://github.com/thejoeker12/jamfpy-python-sdk-jamfpro)
- Designed for automation and CI/CD usage
- Works with output generated by **Prune**

---

## Supported Resource Types

The exact supported resources depend on JamfPy API coverage, but typically include:

- Policies
- Scripts
- Extension Attributes
- Computer Groups
- Mobile Device Groups
- Configuration Profiles
- Packages (optional / configurable)

(See JamfPy documentation for supported endpoints.)

---

## How It Works

1. You identify unused or disabled Jamf resources (e.g. with **Prune**)
2. Export those resources into one or more JSON files
3. Provide the JSON files to `jamf-resource-deleter`
4. The module (alongside JamfPy):
    - Authenticates to Jamf Pro
    - Iterates through each resource
    - Deletes it via the Jamf Pro API


### Example

```py
import os
from jamf_resource_deleter.jamf_resource_deleter import JamfResourceDeleter
import jamfpy

client_id = "YOUR-CLIENT-ID"
client_secrent = "YOUR-CLIENT-SECRET"
jamfpro_url = "https://your-jamfpro-server.com"

jamfpy_client = jamfpy.Tenant(
    fqdn = jamfpro_url,
    auth_method="oauth2",
    client_id=client_id,
    client_secret=client_secrent,
    token_exp_threshold_mins=1
)

deleter = JamfResourceDeleter(jamfpy_client)

deleter.delete_from_json("PATH-TO-JSON-File")
```

---

## Installation

### Requirements
- Python **3.9+**
- Jamf Pro account with API permissions
- Jamf Pro API credentials
- Network access to your Jamf tenant

---

### Install from PyPi

```bash
pip install jamf-resource-deleter
```

---

### Install from source (development)

```bash
git clone https://github.com/your-org/jamf-resource-deleter.git
cd jamf-resource-deleter
pip install -e .
```

---

### Dependencies

This project uses:

- [**JamfPy** – Jamf Pro Python SDK](https://github.com/thejoeker12/jamfpy-python-sdk-jamfpro)
- `requests`
- Standard Python libraries

JamfPy is installed automatically as a dependency.

---

## Authentication

Authentication is handled by **JamfPy**.

You can create a JamfPy client using the following:

```py
import jamfpy

client_id = "YOUR-CLIENT-ID"
client_secrent = "YOUR-CLIENT-SECRET"
jamfpro_url = "https://your-jamfpro-server.com"

jamfpy_client = jamfpy.Tenant(
    fqdn = jamfpro_url,
    auth_method="oauth2"
    client_id=client_id,
    client_secret=client_secrent,
    token_exp_threshold_mins=1
)
```

Refer to the **JamfPy documentation** for supported authentication methods.

---

## Input JSON Format

You may supply **one or more JSON files**.

### JSON structure

Each file must contain an array of objects with at minimum:

- `resourceType` - Jamf Pro resource type
- `id` – Jamf Pro resource ID
- `name` – Human-readable name (used for logging / validation)

#### Example

```json
{
    "unusedComputerProfiles": [{
        "id": 12,
        "name": "Restrictions"
    }]
}
```

Each resource type has to match the following naming convention, this table is also the supported resources at time of writing:

| JSON Key                     | Jamf Resource Type              | Delete Method                                 |
|-----------------------------|----------------------------------|-----------------------------------------------|
| `unusedComputerGroups`      | Computer Groups                  | `_delete_computer_group`                      |
| `unusedMacApps`             | macOS Applications               | `_delete_apps`                                |
| `unusedMobileDeviceApps`    | Mobile Device Applications       | `_delete_apps`                                |
| `unusedPackages`            | Packages                         | `_delete_packages`                            |
| `unusedPolicies`            | Policies                         | `_delete_policies`                            |
| `unusedComputerProfiles`    | Computer Configuration Profiles  | `_delete_profiles`                            |
| `unusedScripts`             | Scripts                          | `_delete_scripts`                             |
| `unusedComputerEAs`         | Computer Extension Attributes    | `_delete_computer_extension_attributes`       |
| `unusedRestrictedSoftware`  | Restricted Software              | `_delete_restricted_software`                 |

---

