Skip to main content

Safely extract and restore project snapshots created by projectclone — secure, atomic, integrity-checked restore engine.

Project description

projectrestore logo

PyPI version Python Wheel Release

Build status Codecov Test Coverage Code style: black Ruff Security

Downloads OS Python Versions

License: MIT

Docs

🛠️ projectrestore — Secure, Atomic, Verified Project Restore

projectrestore is the companion tool to
projectclone.

It safely restores project backups created via projectclone — with strict safety guarantees, atomic replacement, rollback, checksum verification, PID locking, and tar-bomb protection.

Mission: Restore project environments safely, predictably, and without trust assumptions — even across systems.


✅ Key Features

Capability Description
🔐 Atomic restore Extracts to temp dir → atomic swap → rollback if failed
🛡️ Zero-trust archive validation Rejects suspicious tar entries (symlink, device, traversal)
📦 Tarbomb protection Max-files & max-bytes enforcement
🧾 SHA-256 integrity check Optional digest validation before restore
🚫 Privilege-safe Strip setuid/setgid, block device nodes
🔄 Dry-run validation Verify archives without touching disk
🔒 PID locking Prevent concurrent restores
🧯 Crash-safe Best-effort rollback & cleanup
📁 Cross-platform Works on Linux, Termux/Android, VPS, containers
No dependencies Pure Python — clean install, small footprint

🧩 Installation

pip install projectrestore

Or editable dev install:

git clone https://github.com/dhruv13x/projectrestore
cd projectrestore
pip install -e .


---

🚀 Quick Start

Restore the latest backup made by projectclone:

projectrestore

Restore to a specific directory:

projectrestore --backup-dir ~/project_backups --extract-dir ./restored_project

Dry-run (validate only):

projectrestore --dry-run

Verify SHA-256 before restore:

projectrestore --checksum checksums.txt

Limit archive extraction:

projectrestore --max-files 50000 --max-bytes 2G

Debug logs:

projectrestore --debug


---

🔍 How It Works (Safety Model)

1. Validate backup archive structure & metadata


2. Create PID lock  single-instance safety


3. Extract to isolated temporary directory


4. Apply strict checks:

No absolute paths

No ../ traversal

No symlinks / hardlinks

No device nodes / FIFO

No setuid/setgid preserved



5. Optionally verify SHA-256


6. Atomic swap:

Move old dir  backup

Move new dir  destination



7. Cleanup old state (or rollback on error)




---

⚠️ Design Philosophy

> Separation of responsibilities
projectclone = capture
projectrestore = apply safely



This tool intentionally does not share codebase or execution surface with projectclone to ensure:

Security isolation

Clear trust boundary

Maintenance clarity

Lower blast radius

Independent versioning & release trains



---

🧪 Exit Codes

Code	Meaning

0	Success
1	Error
2	Interrupted / signal
3	Another instance running (PID lock)



---

📂 Compatibility

System	Supported

Linux	✅
WSL	✅
Termux / Android	✅
Docker	✅
macOS	⚠️ tar behavior varies  full support in v1.0



---

🤝 Ecosystem

Tool	Purpose

projectclone	Create stateful reproducible project snapshots
projectrestore	Securely apply snapshots with verification & rollback


These tools form a reproducible project state suite.


---

📦 Future Roadmap

Interactive restore preview (file diff, size, changeset)

Restore-to-new-path mode

Encrypted backup support

Signature verification (public key)

macOS hardened extractor extension



---

✅ Requirements

Python 3.8+

Tar archives built by projectclone



---

📜 License

MIT  free, open, audit-friendly, production-safe.


---

👨‍💻 Author

Dhruv  dhruv13x@gmail.com
Designed for reproducibility, disaster-recovery, and zero-trust restore paths.


---

> ⭐️ If this project saves your work or your sanity, consider starring the repo!
Issues & PRs welcome  security mindset first.



---

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

projectrestore-1.0.0.tar.gz (14.8 kB view details)

Uploaded Source

Built Distribution

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

projectrestore-1.0.0-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file projectrestore-1.0.0.tar.gz.

File metadata

  • Download URL: projectrestore-1.0.0.tar.gz
  • Upload date:
  • Size: 14.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for projectrestore-1.0.0.tar.gz
Algorithm Hash digest
SHA256 d4229c6f70d15ad03d379c97f83212ce66b132a81ca3843bb256a06474dc16a3
MD5 17949258773189d1ecdc9e6cfbbdf6fe
BLAKE2b-256 9a1445507c5dedc630254566ecff59731536bb63fce56e8aa15f0ec8c3d407ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for projectrestore-1.0.0.tar.gz:

Publisher: publish.yml on dhruv13x/projectrestore

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file projectrestore-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: projectrestore-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for projectrestore-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 39e7cf21bc3936d02d2074e86115e379782b02867c38892fa37338cbb1372fcc
MD5 9f4acd34ac9785df5840c803a1a19fc1
BLAKE2b-256 4c1718295a7cfd8e4c9f64a768ed100a4ceb0af27024d75e0efa8e6e7b1d34e5

See more details on using hashes here.

Provenance

The following attestation bundles were made for projectrestore-1.0.0-py3-none-any.whl:

Publisher: publish.yml on dhruv13x/projectrestore

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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