1bcb3b185c
Standalone Python tool. Hits git.churchofmalware.org public API every
12h (00:00/12:00), downloads any repo HEAD whose SHA hasn't already
been snapshotted to pCloud, with local-staging fallback when the FUSE
mount is unavailable. Matrix notification stub for when the home
server is back.
Devil's-advocate findings folded into the design:
- shutil.copy2 + size verify + unlink, not os.rename, for FUSE safety
- no pCloud daemon auto-start (no user unit; DISPLAY=:0 unreliable);
relies on Persistent timer + pending flush for recovery
- two-call API path retained because the repo list response does not
include commit.sha
Audit-driven security fixes:
- repo names whitelist-validated (^[a-zA-Z0-9._-]+$)
- urllib.parse.quote on all interpolated URL segments
- same-file no-op guard in place_into_pcloud
- existence check moved to main() so cached files don't generate
spurious notify entries
13 pytest tests passing.
63 lines
2.4 KiB
Markdown
63 lines
2.4 KiB
Markdown
# coe-mirror
|
||
|
||
Mirror Nightmare_Eclipse repos from Church of Malware to pCloud.
|
||
|
||
## What it does
|
||
|
||
Monitors `Nightmare_Eclipse` on `git.churchofmalware.org` for new or updated repos. Downloads per-commit zip snapshots to `~/pCloudDrive/Hacking/Nightmare_Eclipse/`. Falls back to local staging when pCloud is down. Runs at 00:00 and 12:00 daily with boot catch-up.
|
||
|
||
## Filename convention
|
||
|
||
`{repo}_{short_sha}.zip` where short_sha is the first 8 chars of the HEAD commit SHA on the default branch. New commits produce new files; old snapshots stay as history.
|
||
|
||
## Install
|
||
|
||
```
|
||
cd ~/tools/coe-mirror
|
||
bash install.sh
|
||
```
|
||
|
||
## Manual run
|
||
|
||
```
|
||
systemctl --user start coe-mirror.service
|
||
# or directly:
|
||
python3 ~/tools/coe-mirror/coe_mirror.py
|
||
```
|
||
|
||
## Logs
|
||
|
||
- File: `~/.local/share/coe-mirror/coe-mirror.log` (rotated at 5 MB, 3 backups)
|
||
- Journal: `journalctl --user -u coe-mirror.service -n 100`
|
||
|
||
## Storage estimate
|
||
|
||
8 repos × 2 runs/day × ~1 commit/repo/day ≈ 16 zips/day ≈ ~5 MB/month at current zip sizes (~265 KB each). Old snapshots accumulate — no automatic pruning. Manually prune `~/pCloudDrive/Hacking/Nightmare_Eclipse/` if needed.
|
||
|
||
## Behavior when pCloud is down
|
||
|
||
Downloads land in `~/.local/share/coe-mirror/pending/`. Next run (or any subsequent invocation) flushes them to pCloud once the mount is healthy. No auto-start of the pCloud daemon — by design, because the daemon is a GUI AppImage with no systemd user unit. If pCloud is offline, ensure the user session is active and pCloud is running before the next scheduled run, or trigger manually.
|
||
|
||
## Catch-up after machine was off
|
||
|
||
The timer is `Persistent=true` and `OnBootSec=2min`. Missed windows run automatically on next boot. The tool also diffs against the pCloud directory, so even if a run is skipped entirely, the next run catches up everything that's missing.
|
||
|
||
## Matrix notification
|
||
|
||
Currently a stub. Real implementation deferred until the home Matrix server is back. Reference: `~/tools/devtrack/scripts/matrix_alerts.py` shows the auth + send pattern (Infisical creds `MATRIX_USER_ID` and `MATRIX_ACCESS_TOKEN` from the `devtrack` folder, POST to `/_matrix/client/r0/rooms/{room_id}/send/m.room.message`).
|
||
|
||
## Testing
|
||
|
||
```
|
||
cd ~/tools/coe-mirror
|
||
python3 -m pytest tests/ -v
|
||
```
|
||
|
||
## Uninstall
|
||
|
||
```
|
||
systemctl --user disable --now coe-mirror.timer
|
||
rm ~/.config/systemd/user/coe-mirror.{service,timer}
|
||
systemctl --user daemon-reload
|
||
```
|