Skip to main content

A tool for recovering Protocol Buffer definitions from gRPC services using reflection API and generating client code

Project description

PBReflect

PyPI version Python versions GitHub Actions License: MIT Downloads Code style: ruff

PBReflect is a powerful tool for recovering Protocol Buffer (protobuf) definitions from gRPC services using the reflection API. It allows developers to generate .proto files from running gRPC servers without having access to the original source code.

Features

  • Automatic Discovery: Automatically discovers all services and messages exposed by a gRPC server
  • Proto Generation: Generates complete .proto files with proper package structure
  • TLS Support: Supports secure connections with custom certificates
  • Dependency Resolution: Correctly handles dependencies between proto files
  • Simple CLI: Easy-to-use command-line interface
  • Client Generation: Generate Python client libraries from .proto files with multiple generator strategies
  • Custom Templates: Support for custom code generation templates
  • All-in-One Command: Generate client code directly from a gRPC server in a single step

Installation

# Install using pip
pip install pbreflect

# Or using Poetry
poetry add pbreflect

Quick Start

Direct Client Generation from Server

PBReflect provides an all-in-one command to generate client code directly from a gRPC server:

# Generate client code directly from a gRPC server
pbreflect reflect -h localhost:50051 -o ./clients

This command:

  1. Connects to the gRPC server
  2. Retrieves proto definitions using reflection
  3. Generates client code in one step
  4. Automatically cleans up temporary proto files

You can customize the generation with various options:

# Generate custom client code directly from a server
pbreflect reflect -h localhost:50051 -o ./clients --gen-type pbreflect --template-dir ./my-templates

For secure connections, you can use TLS certificates:

# With TLS support
pbreflect reflect -h secure.example.com:443 -o ./clients \
  --root-cert ./certs/ca.pem \
  --private-key ./certs/client.key \
  --cert-chain ./certs/client.pem

Recovering Proto Files Only

If you only need to recover proto files from a gRPC server:

# Basic usage
pbreflect get-protos -h localhost:50051 -o ./protos

This will connect to the gRPC server at localhost:50051, retrieve all available proto definitions, and save them to the ./protos directory.

Using TLS/SSL

For secure connections, you can use TLS certificates:

# With root certificate only
pbreflect get-protos -h secure.example.com:443 -o ./protos --root-cert ./certs/ca.pem

# With full client authentication
pbreflect get-protos -h secure.example.com:443 -o ./protos \
  --root-cert ./certs/ca.pem \
  --private-key ./certs/client.key \
  --cert-chain ./certs/client.pem

Client Code Generation from Proto Files

If you already have proto files and want to generate client code:

# Generate client code from proto files
pbreflect generate --proto-dir ./protos --output-dir ./generated --gen-type pbreflect

Generator Strategies

PBReflect supports multiple code generation strategies:

  • default: Standard protoc Python output
  • mypy: Standard output with mypy type annotations
  • betterproto: Uses betterproto generator for more Pythonic API
  • pbreflect: Custom generator with enhanced gRPC client support

Example:

# Generate code using the betterproto strategy
pbreflect generate --proto-dir ./protos --output-dir ./generated --gen-type betterproto

Custom Templates

For the pbreflect generator strategy, you can specify a custom templates directory:

# Generate code using custom templates
pbreflect generate --proto-dir ./protos --output-dir ./generated --gen-type pbreflect --template-dir ./my-templates

This allows you to customize the generated code according to your needs.

CLI Commands

PBReflect provides a comprehensive CLI interface:

pbreflect reflect     # Generate client code directly from a gRPC server (all-in-one)
pbreflect get-protos  # Recover proto files from a running gRPC server
pbreflect generate    # Generate client code from proto files
pbreflect info        # Display information about available services

Use --help with any command to see all available options.

Programmatic Usage

You can also use PBReflect in your Python code:

from pathlib import Path
from pbreflect.protorecover.recover_service import RecoverService

# Basic usage
with RecoverService("localhost:50051", Path("./protos")) as service:
    service.recover_proto_files()

# With TLS
with RecoverService(
    "secure.example.com:443",
    Path("./protos"),
    use_tls=True,
    root_certificates_path=Path("./certs/ca.pem"),
    private_key_path=Path("./certs/client.key"),
    certificate_chain_path=Path("./certs/client.pem")
) as service:
    service.recover_proto_files()

Use Cases

  • API Exploration: Discover and understand the API of a gRPC service
  • Client Development: Generate client code for services without access to original proto files
  • Testing: Create mock clients and servers for testing
  • Reverse Engineering: Analyze and document existing gRPC services
  • Migration: Help migrate from one gRPC implementation to another

Requirements

  • gRPC server with reflection service enabled

How It Works

PBReflect uses the gRPC reflection service to query a server for its service definitions. The reflection service returns FileDescriptorProto messages, which PBReflect then processes to reconstruct the original .proto files.

The process involves:

  1. Connecting to the gRPC server
  2. Querying the reflection service for available services
  3. Retrieving file descriptors for each service
  4. Reconstructing the proto definitions with proper imports
  5. Writing the generated proto files to disk

Limitations

  • The target gRPC server must have the reflection service enabled
  • Some advanced proto features might not be perfectly reconstructed
  • Comments from the original proto files are not recoverable

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for detailed guidelines on:

  • Setting up your development environment
  • Running tests
  • Code style and conventions
  • Pull request process
  • Issue reporting

Publishing

For maintainers, we have documented the release process in PUBLISHING.md, which covers:

  • Version bumping
  • Building packages
  • Publishing to PyPI
  • Creating GitHub releases
  • Documentation updates

License

This project is licensed under the MIT License - see the LICENSE file for details.

Acknowledgments

  • The gRPC team for creating the reflection service
  • All contributors who have helped improve this tool

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pbreflect-1.1.1.tar.gz (41.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pbreflect-1.1.1-py3-none-any.whl (52.1 kB view details)

Uploaded Python 3

File details

Details for the file pbreflect-1.1.1.tar.gz.

File metadata

  • Download URL: pbreflect-1.1.1.tar.gz
  • Upload date:
  • Size: 41.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.11.14 Linux/6.11.0-1018-azure

File hashes

Hashes for pbreflect-1.1.1.tar.gz
Algorithm Hash digest
SHA256 2f9eec5b48436622fa90829d902fdd5e6941d31274a07452d67f17c9a8c676e5
MD5 bb550ce62833e7af9e267a132dfa67c9
BLAKE2b-256 ff3a29570062a9c3d061869a377e0ff59dda8341108ab4e4df97232456586765

See more details on using hashes here.

File details

Details for the file pbreflect-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: pbreflect-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 52.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.7.1 CPython/3.11.14 Linux/6.11.0-1018-azure

File hashes

Hashes for pbreflect-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1674f6b666ca56ba16406e45dc25d162dd23ac089c9e697b0b25ce183a691857
MD5 c36c0100cd9a03e59cf29aacfb98c4a3
BLAKE2b-256 c5616f028ece361051bbb9ff8c99fb368cb21f3255205f323159086a1db26c8f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page