Restore
Restore
Restore file to captured state
Every captured change carries its SHA-256-addressed content in BLOB_STORE. Restoring writes that content back to the original path — current file gets backed up to <path>.drift_restore_backup_<epoch> before overwrite.
What will change
Preview -- nothing has been written yet.
| Target file | /var/www/vhosts/3dshawn.com/site1/TEMPLATES/settings.html |
| Site | DriftSense self-monitor on local |
| Kind | local |
| Captured at | 2026-07-12 00:19:34 |
| Captured SHA | 7f92daebf65c0996f6a32668bba16c98b7253b08dfd0f1b31ebc533531f91712 |
Current state on disk
Live check just now. If SHAs match, the restore is a no-op.
| File present | yes |
| Size | 7111 bytes |
| Current SHA | cec92d338ed6 |
| Same as captured? | no -- restore will change it |
What restore will change — live diff
Left column shows current on-disk content; right shows what restore will write. +0 additions, -8 deletions, 101 unchanged context lines.
| 1 | 1 | <div class="page-head"> |
| 2 | 2 | <span class="page-eyebrow"><span class="dot"></span> Configure</span> |
| 3 | 3 | <h1 class="page-title">Settings</h1> |
| 4 | 4 | <p class="page-subtitle">Installation-level configuration. Read from <code>/etc/drift_sense/drift_sense.conf</code> -- edit that file to change values, then restart the daemons.</p> |
| 5 | </div> | |
| 6 | ||
| 7 | <div class="ds-guide"> | |
| 8 | <div class="dsg-icon">i</div> | |
| 9 | <div> | |
| 10 | <span class="dsg-title">What's live-editable vs static:</span> | |
| 11 | The <strong>global scan settings</strong> below (ignore list, file-type filter, max size) are DB-backed and take effect on the very next scanner tick — no daemon restart needed. Global ignore patterns are <strong>UNION'd</strong> <span class="ds-help" data-help-title="UNION vs override" data-help-body="For ignore patterns: both global and per-monitor lists apply, so if global says <code>*.log</code> and a monitor says <code>tmp/</code>, both are excluded. For file-type filter: per-monitor wins if set (empty = fall back to global). For max file size: per-monitor wins if set."></span> with each monitor's own list. Anything under <em>Resolved configuration</em> requires editing the conf file. | |
| 12 | </div> | |
| 13 | 5 | </div> |
| 14 | 6 | |
| 15 | 7 | <div class="dash-grid" style="grid-template-columns:repeat(3,1fr);margin-bottom:16px"> |
| 16 | 8 | <div class="module glow-teal"> |
| 17 | 9 | <div class="module-head"><div class="left"><div class="module-title">BLOB_STORE size</div><span class="module-subtitle">Unique content states.</span></div></div> |
| 18 | 10 | <div class="module-body kpi kpi-teal"><div class="num">$blob_ct</div><div class="lbl">unique blobs</div></div> |
| 19 | 11 | </div> |
| 20 | 12 | <div class="module glow-emerald"> |
| 21 | 13 | <div class="module-head"><div class="left"><div class="module-title">Compression ratio</div><span class="module-subtitle">Uncompressed vs on-disk.</span></div></div> |
| 22 | 14 | <div class="module-body kpi kpi-emerald"><div class="num">$ratio</div><div class="lbl">savings</div></div> |
| 23 | 15 | </div> |
| 24 | 16 | <div class="module glow-sky"> |
| 25 | 17 | <div class="module-head"><div class="left"><div class="module-title">Dedup references</div><span class="module-subtitle">How many FILE_CHANGES rows point at BLOB_STORE.</span></div></div> |
| 26 | 18 | <div class="module-body kpi kpi-sky"><div class="num">$total_refs</div><div class="lbl">references</div></div> |
| 27 | 19 | </div> |
| 28 | 20 | </div> |
| 29 | 21 | |
| 30 | 22 | <div class="dash-grid" style="grid-template-columns:1fr 1fr;margin-bottom:16px"> |
| 31 | 23 | <div class="module glow-sky"> |
| 32 | 24 | <div class="module-head"><div class="left"> |
| 33 | 25 | <div class="module-title">Auto-purge plan (30d)</div> |
| 34 | 26 | <span class="module-subtitle">Dry-run runs daily at 03:15 — <a href="/purge_log.cgi" style="color:var(--accent-hi)">full log</a></span> |
| 35 | 27 | </div></div> |
| 36 | 28 | <div class="module-body kpi kpi-sky"> |
| 37 | 29 | <div class="num">$purge_dry_ct</div> |
| 38 | 30 | <div class="lbl">blobs would be freed</div> |
| 39 | 31 | <div class="sub"><strong>$purge_dry_bytes</strong> reclaimable · last run <span class="ts" data-ts="$last_purge_epoch" data-fmt="relative">$last_purge_h</span></div> |
| 40 | 32 | </div> |
| 41 | 33 | </div> |
| 42 | 34 | <div class="module glow-amber"> |
| 43 | 35 | <div class="module-head"><div class="left"> |
| 44 | 36 | <div class="module-title">Live purges (30d)</div> |
| 45 | 37 | <span class="module-subtitle">Actual disk reclaimed once live mode is on.</span> |
| 46 | 38 | </div></div> |
| 47 | 39 | <div class="module-body kpi kpi-amber"> |
| 48 | 40 | <div class="num">$purge_live_ct</div> |
| 49 | 41 | <div class="lbl">blobs deleted</div> |
| 50 | 42 | <div class="sub"><strong>$purge_live_bytes</strong> reclaimed</div> |
| 51 | 43 | </div> |
| 52 | 44 | </div> |
| 53 | 45 | </div> |
| 54 | 46 | |
| 55 | 47 | [if:$saved] |
| 56 | 48 | <div class="banner banner-ok" style="margin:0 0 16px;padding:10px 14px;border-radius:10px;background:rgba(52,211,153,.10);border:1px solid rgba(52,211,153,.35);color:#a7f3d0;font-size:13px"> |
| 57 | 49 | Global scan settings saved. Applies to the very next scanner tick. |
| 58 | 50 | </div> |
| 59 | 51 | [/if] |
| 60 | 52 | |
| 61 | 53 | <div class="module glow-amber" style="margin-bottom:16px"> |
| 62 | 54 | <div class="module-head"><div class="left"> |
| 63 | 55 | <div class="module-icon"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="15" y1="9" x2="9" y2="15"/><line x1="9" y1="9" x2="15" y2="15"/></svg></div> |
| 64 | 56 | <div class="module-title">Global scan settings</div> |
| 65 | 57 | <span class="module-subtitle">Applied to every monitor -- portfolio-wide. Ignore patterns are UNION'd with each monitor's own list. File-type filter is used only when a monitor's own filter is empty.</span> |
| 66 | 58 | </div></div> |
| 67 | 59 | <div class="module-body"> |
| 68 | 60 | <form method="post" action="/settings.cgi" style="display:flex;flex-direction:column;gap:14px"> |
| 69 | 61 | <input type="hidden" name="save_globals" value="1"> |
| 70 | 62 | |
| 71 | 63 | <label style="display:flex;flex-direction:column;gap:4px"> |
| 72 | 64 | <span class="rb-label">Global ignore patterns |
| 73 | 65 | <span class="dim" style="text-transform:none;letter-spacing:0;font-size:10.5px">— one per line OR comma-separated. Glob wildcards <code>*</code>, <code>?</code>, and <code>**</code> supported.</span> |
| 74 | 66 | </span> |
| 75 | 67 | <textarea name="global_ignore_list" rows="10" placeholder="*.swp *.tmp *.bak node_modules/* .git/* logs/*" |
| 76 | 68 | style="background:var(--bg-1);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:10px 12px;font-family:var(--mono);font-size:11.5px;line-height:1.6;resize:vertical">$global_ignore_pretty</textarea> |
| 77 | 69 | </label> |
| 78 | 70 | |
| 79 | 71 | <div style="display:flex;gap:12px"> |
| 80 | 72 | <label style="flex:2;display:flex;flex-direction:column;gap:4px"> |
| 81 | 73 | <span class="rb-label">Global file-type filter <span class="dim" style="text-transform:none;letter-spacing:0;font-size:10.5px">(blank = all types)</span></span> |
| 82 | 74 | <input type="text" name="global_file_type_filter" value="$global_file_type_filter" placeholder="pl,pm,cgi,html,css,js,sql,conf,md" |
| 83 | 75 | style="background:var(--bg-1);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 12px;font-family:var(--mono);font-size:12px"> |
| 84 | 76 | </label> |
| 85 | 77 | <label style="flex:1;display:flex;flex-direction:column;gap:4px"> |
| 86 | 78 | <span class="rb-label">Global max file size (bytes)</span> |
| 87 | 79 | <input type="number" name="global_max_file_size_bytes" value="$global_max_file_size_bytes" min="0" |
| 88 | 80 | style="background:var(--bg-1);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:8px 12px"> |
| 89 | 81 | </label> |
| 90 | 82 | </div> |
| 91 | 83 | |
| 92 | 84 | <div style="display:flex;justify-content:flex-end"> |
| 93 | 85 | <button type="submit" class="tr-chip is-active" style="border:none;padding:8px 18px">Save globals</button> |
| 94 | 86 | </div> |
| 95 | 87 | </form> |
| 96 | 88 | </div> |
| 97 | 89 | </div> |
| 98 | 90 | |
| 99 | 91 | <div class="module glow-teal"> |
| 100 | 92 | <div class="module-head"><div class="left"><div class="module-title">Resolved configuration</div><span class="module-subtitle">Merged from conf file + code defaults. Secrets redacted.</span></div></div> |
| 101 | 93 | <div class="module-body tight"> |
| 102 | 94 | <table class="tbl"> |
| 103 | 95 | <thead><tr><th style="width:260px">Key</th><th>Value</th></tr></thead> |
| 104 | 96 | <tbody> |
| 105 | 97 | [loop:@cfg_rows]<tr><td class="mono"><strong>$key</strong></td><td class="mono dim">$value</td></tr>[/loop] |
| 106 | 98 | </tbody> |
| 107 | 99 | </table> |
| 108 | 100 | </div> |
| 109 | 101 | </div> |
Confirm restore
Backs current content to <target>.drift_restore_backup_<epoch>, writes the captured content, verifies SHA post-write.