redundanet 2.0.0__tar.gz → 2.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. redundanet-2.0.2/PKG-INFO +298 -0
  2. redundanet-2.0.2/README.md +258 -0
  3. {redundanet-2.0.0 → redundanet-2.0.2}/pyproject.toml +2 -2
  4. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/auth/gpg.py +4 -4
  5. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/cli/node.py +197 -14
  6. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/utils/process.py +1 -1
  7. redundanet-2.0.0/PKG-INFO +0 -265
  8. redundanet-2.0.0/README.md +0 -225
  9. {redundanet-2.0.0 → redundanet-2.0.2}/LICENSE +0 -0
  10. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/__init__.py +2 -2
  11. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/__main__.py +0 -0
  12. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/auth/__init__.py +0 -0
  13. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/auth/keyserver.py +0 -0
  14. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/cli/__init__.py +0 -0
  15. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/cli/main.py +0 -0
  16. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/cli/network.py +0 -0
  17. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/cli/storage.py +0 -0
  18. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/core/__init__.py +0 -0
  19. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/core/config.py +0 -0
  20. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/core/exceptions.py +0 -0
  21. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/core/manifest.py +0 -0
  22. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/core/node.py +0 -0
  23. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/network/__init__.py +2 -2
  24. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/network/discovery.py +0 -0
  25. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/network/dns.py +0 -0
  26. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/network/validation.py +0 -0
  27. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/storage/__init__.py +2 -2
  28. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/storage/client.py +0 -0
  29. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/storage/furl.py +0 -0
  30. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/storage/introducer.py +0 -0
  31. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/storage/storage.py +0 -0
  32. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/utils/__init__.py +0 -0
  33. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/utils/files.py +0 -0
  34. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/utils/logging.py +0 -0
  35. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/vpn/__init__.py +2 -2
  36. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/vpn/keys.py +0 -0
  37. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/vpn/mesh.py +0 -0
  38. {redundanet-2.0.0 → redundanet-2.0.2}/src/redundanet/vpn/tinc.py +0 -0
@@ -0,0 +1,298 @@
1
+ Metadata-Version: 2.1
2
+ Name: redundanet
3
+ Version: 2.0.2
4
+ Summary: Distributed encrypted storage on a mesh VPN network
5
+ Home-page: https://github.com/alessandrodefilippo/redundanet
6
+ License: MIT
7
+ Keywords: distributed-storage,vpn,encryption,mesh-network,tahoe-lafs
8
+ Author: Alessandro De Filippo
9
+ Author-email: alessandro@example.com
10
+ Requires-Python: >=3.11,<4.0
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: System Administrators
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Operating System :: POSIX :: Linux
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Security :: Cryptography
21
+ Classifier: Topic :: System :: Distributed Computing
22
+ Classifier: Topic :: System :: Networking
23
+ Requires-Dist: gitpython (>=3.1,<4.0)
24
+ Requires-Dist: httpx (>=0.26,<0.27)
25
+ Requires-Dist: jinja2 (>=3.1,<4.0)
26
+ Requires-Dist: jsonschema (>=4.21,<5.0)
27
+ Requires-Dist: psutil (>=5.9,<6.0)
28
+ Requires-Dist: pydantic (>=2.5,<3.0)
29
+ Requires-Dist: pydantic-settings (>=2.1,<3.0)
30
+ Requires-Dist: python-gnupg (>=0.5,<0.6)
31
+ Requires-Dist: pyyaml (>=6.0,<7.0)
32
+ Requires-Dist: rich (>=13.7,<14.0)
33
+ Requires-Dist: structlog (>=24.1,<25.0)
34
+ Requires-Dist: typer[all] (>=0.12.0)
35
+ Requires-Dist: watchdog (>=4.0,<5.0)
36
+ Project-URL: Documentation, https://redundanet.readthedocs.io
37
+ Project-URL: Repository, https://github.com/alessandrodefilippo/redundanet
38
+ Description-Content-Type: text/markdown
39
+
40
+ # RedundaNet - Distributed Encrypted Storage Network
41
+
42
+ [![CI](https://github.com/adefilippo83/redundanet/actions/workflows/ci.yml/badge.svg)](https://github.com/adefilippo83/redundanet/actions/workflows/ci.yml)
43
+ [![PyPI](https://img.shields.io/pypi/v/redundanet)](https://pypi.org/project/redundanet/)
44
+ [![License](https://img.shields.io/github/license/adefilippo83/redundanet)](LICENSE)
45
+
46
+ RedundaNet is a distributed, encrypted storage system built on a secure mesh VPN network. It enables users to contribute storage resources to a collective grid while maintaining privacy through end-to-end encryption.
47
+
48
+ **Website**: [https://redundanet.com](https://redundanet.com)
49
+
50
+ ## Features
51
+
52
+ - **Decentralized Architecture**: No central authority or single point of failure
53
+ - **End-to-End Encryption**: Data is encrypted before leaving your device using Tahoe-LAFS
54
+ - **GPG-Based Authentication**: Secure node identity verification via public keyservers
55
+ - **Private Networking**: Secure Tinc mesh VPN isolates the storage network
56
+ - **Erasure Coding**: Data is split and distributed across multiple nodes (3-of-10 scheme)
57
+ - **Open Membership**: Anyone can apply to join the network
58
+ - **Containerized Deployment**: Easy setup with Docker Compose
59
+ - **Raspberry Pi Ready**: Pre-built images for ARM devices
60
+
61
+ ## How It Works
62
+
63
+ ```
64
+ ┌─────────────────────────────────────────────────────────────────────────┐
65
+ │ RedundaNet Network │
66
+ │ │
67
+ │ Your File │
68
+ │ │ │
69
+ │ ▼ │
70
+ │ ┌─────────┐ Encrypted ┌─────────┐ │
71
+ │ │ Encrypt │ ──────────────────►│ Split │ │
72
+ │ │ (AES) │ │(Erasure)│ │
73
+ │ └─────────┘ └────┬────┘ │
74
+ │ │ │
75
+ │ ┌────────────────────────┼────────────────────────┐ │
76
+ │ ▼ ▼ ▼ ▼ ▼ │
77
+ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │
78
+ │ │Share 1│ │Share 2│ │Share 3│ │ ... │ │Share10│ │
79
+ │ └───┬───┘ └───┬───┘ └───┬───┘ └───┬───┘ └───┬───┘ │
80
+ │ │ │ │ │ │ │
81
+ │ ▼ ▼ ▼ ▼ ▼ │
82
+ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │
83
+ │ │Node A │ │Node B │ │Node C │ │Node D │ │Node E │ │
84
+ │ │ (VPN) │◄──►│ (VPN) │◄─►│ (VPN) │◄─►│ (VPN) │◄──►│ (VPN) │ │
85
+ │ └───────┘ └───────┘ └───────┘ └───────┘ └───────┘ │
86
+ │ │
87
+ │ Only 3 of 10 shares needed to reconstruct your file │
88
+ └─────────────────────────────────────────────────────────────────────────┘
89
+ ```
90
+
91
+ **Key Concepts:**
92
+ - **Your data is encrypted** on your device before upload - nodes cannot read your files
93
+ - **Erasure coding** splits data across nodes - any 3 of 10 nodes can reconstruct your file
94
+ - **Mesh VPN** connects all nodes securely - no central server required
95
+ - **GPG keys** verify node identity - published to public keyservers
96
+
97
+ ## Join the Network
98
+
99
+ Want to contribute storage and join RedundaNet? Here's how:
100
+
101
+ ### 1. Generate and Publish Your GPG Key
102
+
103
+ ```bash
104
+ # Install the CLI
105
+ pip install redundanet
106
+
107
+ # Generate a GPG key for your node
108
+ redundanet node keys generate --name my-node --email you@example.com
109
+
110
+ # Publish your key to public keyservers
111
+ redundanet node keys publish --key-id YOUR_KEY_ID
112
+ ```
113
+
114
+ ### 2. Submit Your Application
115
+
116
+ Visit [redundanet.com/join.html](https://redundanet.com/join.html) and fill out the application form with:
117
+ - Your GPG Key ID
118
+ - Storage contribution (how much space you'll share)
119
+ - Your region
120
+ - Device type
121
+
122
+ This creates a GitHub issue that's automatically processed.
123
+
124
+ ### 3. Wait for Approval
125
+
126
+ A maintainer will review your application and merge the PR that adds your node to the network manifest.
127
+
128
+ ### 4. Set Up Your Node
129
+
130
+ Once approved:
131
+
132
+ ```bash
133
+ # Clone the repository
134
+ git clone https://github.com/adefilippo83/redundanet.git
135
+ cd redundanet
136
+
137
+ # Initialize your node (use the name assigned to you)
138
+ redundanet init --name node-XXXXXXXX
139
+
140
+ # Sync the manifest
141
+ redundanet sync
142
+
143
+ # Start services
144
+ docker compose up -d
145
+
146
+ # Check status
147
+ redundanet status
148
+ ```
149
+
150
+ ## Quick Start (Existing Network Members)
151
+
152
+ ### Prerequisites
153
+
154
+ - Python 3.11+
155
+ - Docker and Docker Compose
156
+ - GPG (for key management)
157
+
158
+ ### Installation
159
+
160
+ ```bash
161
+ pip install redundanet
162
+ ```
163
+
164
+ ### Start Services
165
+
166
+ ```bash
167
+ # As a storage node (contributes storage)
168
+ docker compose --profile storage up -d
169
+
170
+ # As a client only (uses storage)
171
+ docker compose --profile client up -d
172
+ ```
173
+
174
+ ### Upload and Download Files
175
+
176
+ ```bash
177
+ # Upload a file
178
+ redundanet storage upload /path/to/file.txt
179
+ # Returns: URI:CHK:abc123...
180
+
181
+ # Download a file
182
+ redundanet storage download URI:CHK:abc123... /path/to/output.txt
183
+ ```
184
+
185
+ ## CLI Commands
186
+
187
+ ```
188
+ redundanet --help
189
+
190
+ Commands:
191
+ init Initialize a new node
192
+ status Show node and network status
193
+ sync Sync manifest from repository
194
+ validate Validate manifest file
195
+
196
+ node Node management commands
197
+ list List all nodes in the network
198
+ info Show detailed node information
199
+ add Add a new node to manifest
200
+ remove Remove a node from manifest
201
+ keys Manage GPG keys (generate, export, import, publish, fetch, list)
202
+
203
+ network Network management
204
+ join Join an existing network
205
+ leave Leave the network
206
+ peers Show connected peers
207
+ vpn VPN management (start/stop/status)
208
+
209
+ storage Storage management
210
+ status Show storage status
211
+ mount Mount Tahoe filesystem
212
+ unmount Unmount filesystem
213
+ upload Upload a file
214
+ download Download a file
215
+ ```
216
+
217
+ ## Raspberry Pi
218
+
219
+ Pre-built images are available for Raspberry Pi:
220
+
221
+ 1. Download from [GitHub Releases](https://github.com/adefilippo83/redundanet/releases)
222
+ 2. Flash to SD card using Raspberry Pi Imager
223
+ 3. Boot and SSH in: `ssh redundanet@redundanet.local` (password: `redundanet`)
224
+ 4. Run `redundanet init` to configure
225
+
226
+ ## Architecture
227
+
228
+ ```mermaid
229
+ graph TD
230
+ subgraph "Your Device"
231
+ A[redundanet CLI] --> B[Tahoe Client]
232
+ B --> C[Tinc VPN]
233
+ end
234
+
235
+ subgraph "Network Nodes"
236
+ D[Tinc VPN] --> E[Tahoe Storage]
237
+ F[Tinc VPN] --> G[Tahoe Storage]
238
+ H[Tinc VPN] --> I[Tahoe Introducer]
239
+ end
240
+
241
+ C -->|Encrypted Mesh| D
242
+ C -->|Encrypted Mesh| F
243
+ C -->|Encrypted Mesh| H
244
+ ```
245
+
246
+ **Components:**
247
+ - **Tinc VPN**: Creates encrypted mesh network between all nodes
248
+ - **Tahoe-LAFS**: Handles encryption, erasure coding, and distributed storage
249
+ - **GPG**: Authenticates node identity via public keyservers
250
+ - **Manifest**: YAML file in Git defining network configuration
251
+
252
+ ## Documentation
253
+
254
+ - [Installation Guide](docs/installation.md)
255
+ - [Quick Start Guide](docs/quickstart.md)
256
+ - [Configuration Reference](docs/configuration.md)
257
+ - [Architecture Overview](docs/architecture.md)
258
+
259
+ ## Development
260
+
261
+ ```bash
262
+ # Clone repository
263
+ git clone https://github.com/adefilippo83/redundanet.git
264
+ cd redundanet
265
+
266
+ # Install dependencies
267
+ make install
268
+
269
+ # Run tests
270
+ make test
271
+
272
+ # Run linting
273
+ make lint
274
+
275
+ # Run type checking
276
+ make type-check
277
+ ```
278
+
279
+ ## Contributing
280
+
281
+ 1. Fork the repository
282
+ 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
283
+ 3. Make your changes
284
+ 4. Run tests (`make test`) and linting (`make lint`)
285
+ 5. Commit your changes
286
+ 6. Push to the branch (`git push origin feature/amazing-feature`)
287
+ 7. Open a Pull Request
288
+
289
+ ## License
290
+
291
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
292
+
293
+ ## Acknowledgments
294
+
295
+ - [Tahoe-LAFS](https://tahoe-lafs.org/) - Distributed storage system
296
+ - [Tinc VPN](https://www.tinc-vpn.org/) - Mesh VPN daemon
297
+ - [Typer](https://typer.tiangolo.com/) - CLI framework
298
+
@@ -0,0 +1,258 @@
1
+ # RedundaNet - Distributed Encrypted Storage Network
2
+
3
+ [![CI](https://github.com/adefilippo83/redundanet/actions/workflows/ci.yml/badge.svg)](https://github.com/adefilippo83/redundanet/actions/workflows/ci.yml)
4
+ [![PyPI](https://img.shields.io/pypi/v/redundanet)](https://pypi.org/project/redundanet/)
5
+ [![License](https://img.shields.io/github/license/adefilippo83/redundanet)](LICENSE)
6
+
7
+ RedundaNet is a distributed, encrypted storage system built on a secure mesh VPN network. It enables users to contribute storage resources to a collective grid while maintaining privacy through end-to-end encryption.
8
+
9
+ **Website**: [https://redundanet.com](https://redundanet.com)
10
+
11
+ ## Features
12
+
13
+ - **Decentralized Architecture**: No central authority or single point of failure
14
+ - **End-to-End Encryption**: Data is encrypted before leaving your device using Tahoe-LAFS
15
+ - **GPG-Based Authentication**: Secure node identity verification via public keyservers
16
+ - **Private Networking**: Secure Tinc mesh VPN isolates the storage network
17
+ - **Erasure Coding**: Data is split and distributed across multiple nodes (3-of-10 scheme)
18
+ - **Open Membership**: Anyone can apply to join the network
19
+ - **Containerized Deployment**: Easy setup with Docker Compose
20
+ - **Raspberry Pi Ready**: Pre-built images for ARM devices
21
+
22
+ ## How It Works
23
+
24
+ ```
25
+ ┌─────────────────────────────────────────────────────────────────────────┐
26
+ │ RedundaNet Network │
27
+ │ │
28
+ │ Your File │
29
+ │ │ │
30
+ │ ▼ │
31
+ │ ┌─────────┐ Encrypted ┌─────────┐ │
32
+ │ │ Encrypt │ ──────────────────►│ Split │ │
33
+ │ │ (AES) │ │(Erasure)│ │
34
+ │ └─────────┘ └────┬────┘ │
35
+ │ │ │
36
+ │ ┌────────────────────────┼────────────────────────┐ │
37
+ │ ▼ ▼ ▼ ▼ ▼ │
38
+ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │
39
+ │ │Share 1│ │Share 2│ │Share 3│ │ ... │ │Share10│ │
40
+ │ └───┬───┘ └───┬───┘ └───┬───┘ └───┬───┘ └───┬───┘ │
41
+ │ │ │ │ │ │ │
42
+ │ ▼ ▼ ▼ ▼ ▼ │
43
+ │ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │
44
+ │ │Node A │ │Node B │ │Node C │ │Node D │ │Node E │ │
45
+ │ │ (VPN) │◄──►│ (VPN) │◄─►│ (VPN) │◄─►│ (VPN) │◄──►│ (VPN) │ │
46
+ │ └───────┘ └───────┘ └───────┘ └───────┘ └───────┘ │
47
+ │ │
48
+ │ Only 3 of 10 shares needed to reconstruct your file │
49
+ └─────────────────────────────────────────────────────────────────────────┘
50
+ ```
51
+
52
+ **Key Concepts:**
53
+ - **Your data is encrypted** on your device before upload - nodes cannot read your files
54
+ - **Erasure coding** splits data across nodes - any 3 of 10 nodes can reconstruct your file
55
+ - **Mesh VPN** connects all nodes securely - no central server required
56
+ - **GPG keys** verify node identity - published to public keyservers
57
+
58
+ ## Join the Network
59
+
60
+ Want to contribute storage and join RedundaNet? Here's how:
61
+
62
+ ### 1. Generate and Publish Your GPG Key
63
+
64
+ ```bash
65
+ # Install the CLI
66
+ pip install redundanet
67
+
68
+ # Generate a GPG key for your node
69
+ redundanet node keys generate --name my-node --email you@example.com
70
+
71
+ # Publish your key to public keyservers
72
+ redundanet node keys publish --key-id YOUR_KEY_ID
73
+ ```
74
+
75
+ ### 2. Submit Your Application
76
+
77
+ Visit [redundanet.com/join.html](https://redundanet.com/join.html) and fill out the application form with:
78
+ - Your GPG Key ID
79
+ - Storage contribution (how much space you'll share)
80
+ - Your region
81
+ - Device type
82
+
83
+ This creates a GitHub issue that's automatically processed.
84
+
85
+ ### 3. Wait for Approval
86
+
87
+ A maintainer will review your application and merge the PR that adds your node to the network manifest.
88
+
89
+ ### 4. Set Up Your Node
90
+
91
+ Once approved:
92
+
93
+ ```bash
94
+ # Clone the repository
95
+ git clone https://github.com/adefilippo83/redundanet.git
96
+ cd redundanet
97
+
98
+ # Initialize your node (use the name assigned to you)
99
+ redundanet init --name node-XXXXXXXX
100
+
101
+ # Sync the manifest
102
+ redundanet sync
103
+
104
+ # Start services
105
+ docker compose up -d
106
+
107
+ # Check status
108
+ redundanet status
109
+ ```
110
+
111
+ ## Quick Start (Existing Network Members)
112
+
113
+ ### Prerequisites
114
+
115
+ - Python 3.11+
116
+ - Docker and Docker Compose
117
+ - GPG (for key management)
118
+
119
+ ### Installation
120
+
121
+ ```bash
122
+ pip install redundanet
123
+ ```
124
+
125
+ ### Start Services
126
+
127
+ ```bash
128
+ # As a storage node (contributes storage)
129
+ docker compose --profile storage up -d
130
+
131
+ # As a client only (uses storage)
132
+ docker compose --profile client up -d
133
+ ```
134
+
135
+ ### Upload and Download Files
136
+
137
+ ```bash
138
+ # Upload a file
139
+ redundanet storage upload /path/to/file.txt
140
+ # Returns: URI:CHK:abc123...
141
+
142
+ # Download a file
143
+ redundanet storage download URI:CHK:abc123... /path/to/output.txt
144
+ ```
145
+
146
+ ## CLI Commands
147
+
148
+ ```
149
+ redundanet --help
150
+
151
+ Commands:
152
+ init Initialize a new node
153
+ status Show node and network status
154
+ sync Sync manifest from repository
155
+ validate Validate manifest file
156
+
157
+ node Node management commands
158
+ list List all nodes in the network
159
+ info Show detailed node information
160
+ add Add a new node to manifest
161
+ remove Remove a node from manifest
162
+ keys Manage GPG keys (generate, export, import, publish, fetch, list)
163
+
164
+ network Network management
165
+ join Join an existing network
166
+ leave Leave the network
167
+ peers Show connected peers
168
+ vpn VPN management (start/stop/status)
169
+
170
+ storage Storage management
171
+ status Show storage status
172
+ mount Mount Tahoe filesystem
173
+ unmount Unmount filesystem
174
+ upload Upload a file
175
+ download Download a file
176
+ ```
177
+
178
+ ## Raspberry Pi
179
+
180
+ Pre-built images are available for Raspberry Pi:
181
+
182
+ 1. Download from [GitHub Releases](https://github.com/adefilippo83/redundanet/releases)
183
+ 2. Flash to SD card using Raspberry Pi Imager
184
+ 3. Boot and SSH in: `ssh redundanet@redundanet.local` (password: `redundanet`)
185
+ 4. Run `redundanet init` to configure
186
+
187
+ ## Architecture
188
+
189
+ ```mermaid
190
+ graph TD
191
+ subgraph "Your Device"
192
+ A[redundanet CLI] --> B[Tahoe Client]
193
+ B --> C[Tinc VPN]
194
+ end
195
+
196
+ subgraph "Network Nodes"
197
+ D[Tinc VPN] --> E[Tahoe Storage]
198
+ F[Tinc VPN] --> G[Tahoe Storage]
199
+ H[Tinc VPN] --> I[Tahoe Introducer]
200
+ end
201
+
202
+ C -->|Encrypted Mesh| D
203
+ C -->|Encrypted Mesh| F
204
+ C -->|Encrypted Mesh| H
205
+ ```
206
+
207
+ **Components:**
208
+ - **Tinc VPN**: Creates encrypted mesh network between all nodes
209
+ - **Tahoe-LAFS**: Handles encryption, erasure coding, and distributed storage
210
+ - **GPG**: Authenticates node identity via public keyservers
211
+ - **Manifest**: YAML file in Git defining network configuration
212
+
213
+ ## Documentation
214
+
215
+ - [Installation Guide](docs/installation.md)
216
+ - [Quick Start Guide](docs/quickstart.md)
217
+ - [Configuration Reference](docs/configuration.md)
218
+ - [Architecture Overview](docs/architecture.md)
219
+
220
+ ## Development
221
+
222
+ ```bash
223
+ # Clone repository
224
+ git clone https://github.com/adefilippo83/redundanet.git
225
+ cd redundanet
226
+
227
+ # Install dependencies
228
+ make install
229
+
230
+ # Run tests
231
+ make test
232
+
233
+ # Run linting
234
+ make lint
235
+
236
+ # Run type checking
237
+ make type-check
238
+ ```
239
+
240
+ ## Contributing
241
+
242
+ 1. Fork the repository
243
+ 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
244
+ 3. Make your changes
245
+ 4. Run tests (`make test`) and linting (`make lint`)
246
+ 5. Commit your changes
247
+ 6. Push to the branch (`git push origin feature/amazing-feature`)
248
+ 7. Open a Pull Request
249
+
250
+ ## License
251
+
252
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
253
+
254
+ ## Acknowledgments
255
+
256
+ - [Tahoe-LAFS](https://tahoe-lafs.org/) - Distributed storage system
257
+ - [Tinc VPN](https://www.tinc-vpn.org/) - Mesh VPN daemon
258
+ - [Typer](https://typer.tiangolo.com/) - CLI framework
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "redundanet"
3
- version = "2.0.0"
3
+ version = "2.0.2"
4
4
  description = "Distributed encrypted storage on a mesh VPN network"
5
5
  authors = ["Alessandro De Filippo <alessandro@example.com>"]
6
6
  license = "MIT"
@@ -29,7 +29,7 @@ redundanet = "redundanet.cli.main:app"
29
29
 
30
30
  [tool.poetry.dependencies]
31
31
  python = "^3.11"
32
- typer = {extras = ["all"], version = "^0.9.0"}
32
+ typer = {extras = ["all"], version = ">=0.12.0"}
33
33
  pydantic = "^2.5"
34
34
  pydantic-settings = "^2.1"
35
35
  pyyaml = "^6.0"
@@ -43,9 +43,9 @@ class GPGKeyInfo:
43
43
  fingerprint=key.get("fingerprint", ""),
44
44
  user_id=user_id,
45
45
  email=email,
46
- created=key.get("date", None),
47
- expires=key.get("expires", None),
48
- trust=key.get("trust", None),
46
+ created=key.get("date"),
47
+ expires=key.get("expires"),
48
+ trust=key.get("trust"),
49
49
  )
50
50
 
51
51
 
@@ -107,7 +107,7 @@ class GPGManager:
107
107
 
108
108
  key = self._gpg.gen_key(input_data)
109
109
 
110
- if not key.ok:
110
+ if not key.fingerprint:
111
111
  raise GPGError(f"Failed to generate GPG key: {key.status}")
112
112
 
113
113
  logger.info("GPG key generated", fingerprint=str(key))