Getting Palo Alto James Franco Working on Your Firewall Fleet
James Franco is a Python-based tool for Palo Alto Networks firewalls that generates XML configuration templates, validates policies, and exports rule sets into readable formats. It pulls data directly from the PAN-OS API and writes output that can be fed into CI/CD pipelines or just reviewed by hand. I picked it up about two years ago when our team needed to audit three branches with overlapping security policies. The manual review was eating days. Franco cut it down to hours. It lives on GitHub as an open-source repo. You need Python 3.8 or higher installed first. Clone the repo, then run pip install inside the directory. The dependency list is mostly standard library stuff plus requests and lxml. If you're on a machine with no internet access, grab the requirements.txt file before you go air-gapped and install from there. I ran into a problem early on where the tool would silently drop rules that had empty description fields. Our engineers had been skipping descriptions when they created emergency changes. James Franco treated those rules as null objects during export and the resulting policy report was missing about 40 percent of our rules. The workaround was running a quick pre-scan script against the firewall API to identify rules with blank descriptions before feeding the data into Franco. I wrote a short Python snippet that loops through the address and security rule sets and flags any entry where the
How It Actually Works in Practice
The basic flow is: connect to the firewall via API credentials, pull the configuration data, transform it into XML or JSON output, and optionally validate it against a set of rules you define. The tool supports both Panorama-managed devices and standalone firewalls. You point it at a device group or individual firewall and it iterates through the relevant address objects, security policies, NAT rules, and application overrides. One thing most people miss is that James Franco doesn't just read the running config. It can also compare the candidate config against the running config and output a diff. That's actually where it shines. When someone pushes a change through Panorama and you need to know exactly what shifted before it goes live, Franco's diff mode catches things that the GUI sometimes glosses over. I've caught misconfigured source zones in that workflow more than once. The GUI would show the policy as enabled and assume everything was fine. The diff revealed the source zone had been swapped from corp-lan to a decommissioned guest network during a batch rename operation. There's also a validation profile system. You write a JSON file that defines what a "good" policy looks like — things like required source zones, forbidden applications, mandatory action fields. Franco checks each rule against your profile and outputs a pass or fail with the reason. This is useful for compliance audits but it's only as good as the profiles you write. I spent a week refining our validation profiles because the default assumptions in the example file didn't match our actual environment. The tool itself isn't opinionated enough on its own.
Limits and What It Won't Do
James Franco doesn't push configuration changes. It's read-only by design. If you need automation that modifies policies, you'll need to pair it with something like PanOS Python SDK or write your own commit logic. It also struggles with very large configs. Our Panorama instance manages over 600 firewalls and pulling everything in a single session would time out or produce a JSON payload so large the parsing step ate all available RAM. The workaround is splitting your pulls by device group or hierarchical device group. Franco supports batching through the API with pagination, but you have to configure that explicitly in your connection profile. Another limitation is that it only handles standard PAN-OS objects. If you're using custom app signatures or extensions from the WildFire sandbox integration, those don't always map cleanly to the export format. I've seen corrupted entries in the output when a custom application definition had malformed regex patterns in the original config. Franco doesn't error out on those — it just writes garbage into the XML and you have to manually inspect the raw output to find the problem. This usually takes about five minutes per corrupted entry once you know where to look in the node structure. The tool also requires valid API credentials with at least the "device" role. Shared secret authentication works but username/password is not supported in the current release. If your environment relies on RADIUS or LDAP-based firewall authentication, you'll need to create a dedicated API user account with the right privileges. That's a minor setup step but it catches people off guard if they assumed single sign-on would just work.
Get the Full Details

Basic Usage Walkthrough
Start by creating a connection profile. It's a simple JSON file with your firewall IP, API key or shared secret, and the root device path if you're on Panorama. Here's the minimal version: { "host": "panorama.corp.internal",
"apikey": "your-api-key-here", "devicegroup": "branches-west" }
Run the export command with your profile and the output format you want. Franco supports JSON, XML, and CSV. JSON is the default and the most reliable for downstream processing. XML is better if you need to feed the output back into a Palo Alto config import. CSV is human-readable but loses nested object relationships, so it's fine for quick reviews but not for re-import. For a policy diff between candidate and running configs, use the --diff flag and point it at a specific device or device group. The output will list only the rules that changed, with their before and after state. This is faster than loading the full config and comparing by hand. If you're running validation checks, load your custom profile with the --profile flag and the output will break down each rule into pass/fail with the specific field that triggered the failure. I keep a running log of failed validations across deployments. After a few weeks of this data, patterns emerge — like a particular team consistently violating source zone restrictions, or a certain application override being flagged across multiple branches. That's when you start fixing the process instead of just fixing individual rules.

The GitHub repo has example configurations and a few community-contributed validation profiles. They're a starting point, not a finished product. Adapt them to your environment before relying on the output for anything production-critical.