Diff -- /var/www/vhosts/3dshawn.com/site1/settings.cgi

O Operator
Diff

/var/www/vhosts/3dshawn.com/site1/settings.cgi

modified on local at 2026-07-12 00:02:14

Added
+76
lines
Removed
-14
lines
Context
29
unchanged
Blobs
from c8439e2627a2
to c41f0faf4e6b
Restore this content →
Unified diff
Naive LCS-based line diff. Additions in emerald, deletions in rose. Both sides decompressed live from BLOB_STORE.
11#!/usr/bin/perl
2use strict; use warnings; use CGI ();
3use MODS::Config; use MODS::DBConnect; use MODS::Template; use MODS::PageWrapper;
4my $cfg = MODS::Config->new; my $db = MODS::DBConnect->new; my $tpl = MODS::Template->new;
5$|=1; print "Content-Type: text/html; charset=utf-8\nCache-Control: no-cache\n\n";
2#======================================================================
3# DriftSense -- /settings.cgi
4#
5# Read-only view of the resolved config file + editable form for the
6# SCAN_GLOBALS row (global ignore patterns, allowed file types, max
7# file size).
8#======================================================================
9use strict;
10use warnings;
11use CGI ();
12use MODS::Config;
13use MODS::DBConnect;
14use MODS::Template;
15use MODS::PageWrapper;
616
7# The config file is read-only from the UI (managed by installer + admin).
8# We show its resolved values for confirmation + host statistics.
17my $cgi = CGI->new;
18my $cfg = MODS::Config->new;
19my $db = MODS::DBConnect->new;
20my $tpl = MODS::Template->new;
21
22$|=1;
23my $dbh = $db->db_connect or die "DB connect failed\n";
24
25# ---- POST: update globals ------------------------------------------
26if (($ENV{REQUEST_METHOD} || '') eq 'POST' && $cgi->param('save_globals')) {
27 my $ign = $cgi->param('global_ignore_list') // '';
28 my $ftyp = $cgi->param('global_file_type_filter') // '';
29 my $mx = int($cgi->param('global_max_file_size_bytes') || 0);
30
31 # Normalize whitespace on ignore list -> comma-joined single-line
32 my @clean_ign;
33 for my $tok (split /[,\r\n]+/, $ign) {
34 $tok =~ s/^\s+|\s+$//g;
35 push @clean_ign, $tok if length $tok;
36 }
37 my $normalized = join(',', @clean_ign);
38
39 my $q_ign = $dbh->quote($normalized);
40 my $q_ftyp = $dbh->quote($ftyp);
41 $mx = 'NULL' unless $mx;
42
43 $db->db_readwrite($dbh, qq~
44 UPDATE SCAN_GLOBALS
45 SET global_ignore_list = $q_ign,
46 global_file_type_filter = $q_ftyp,
47 global_max_file_size_bytes = $mx
48 WHERE id = 1
49 ~, __FILE__, __LINE__);
50 $db->db_disconnect($dbh);
51 print "Status: 302 Found\nLocation: /settings.cgi?saved=1\n\n";
52 exit;
53}
54
55print "Content-Type: text/html; charset=utf-8\nCache-Control: no-cache\n\n";
56
957my $all = $cfg->all;
1058
1159# Blob store stats
12my $dbh = $db->db_connect or die "DB connect failed\n";
1360my $blob_stats = $db->db_readwrite($dbh, q~
1461 SELECT COUNT(*) AS blob_ct,
1562 COALESCE(SUM(size_uncompressed), 0) AS bytes_uncomp,
1663 COALESCE(SUM(size_compressed), 0) AS bytes_comp,
1764 COALESCE(SUM(ref_count), 0) AS total_refs
1865 FROM BLOB_STORE
66~, __FILE__, __LINE__);
67
68# Global scan settings
69my $g = $db->db_readwrite($dbh, q~
70 SELECT global_ignore_list, global_file_type_filter, global_max_file_size_bytes
71 FROM SCAN_GLOBALS WHERE id = 1 LIMIT 1
1972~, __FILE__, __LINE__);
73my $global_ignore = ($g && $g->{global_ignore_list}) // '';
74my $global_ftypes = ($g && $g->{global_file_type_filter}) // '';
75my $global_max_sz = ($g && $g->{global_max_file_size_bytes}) || 0;
76# Split the ignore list onto lines for the textarea (nicer edit UX)
77my $ignore_pretty = join("\n", split /,/, $global_ignore);
78
2079$db->db_disconnect($dbh);
2180
2281my @cfg_rows;
2382foreach my $k (sort keys %$all) {
2483 my $v = $all->{$k} // '';
25 # Redact secrets
2684 $v = length($v) > 4 ? '***' . substr($v, -4) : '****'
2785 if $k =~ /pass(word)?|secret|hmac|smtp_password/i && length $v;
2886 push @cfg_rows, { key => $k, value => $v };
2987}
3088
3189my $tvars = {
32 cfg_rows => \@cfg_rows,
33 blob_ct => ($blob_stats && $blob_stats->{blob_ct}) || 0,
34 bytes_uncomp => ($blob_stats && $blob_stats->{bytes_uncomp}) || 0,
35 bytes_comp => ($blob_stats && $blob_stats->{bytes_comp}) || 0,
36 total_refs => ($blob_stats && $blob_stats->{total_refs}) || 0,
37 ratio => (($blob_stats && $blob_stats->{bytes_uncomp}) ? sprintf('%.1fx', $blob_stats->{bytes_uncomp} / ($blob_stats->{bytes_comp} || 1)) : '-'),
90 cfg_rows => \@cfg_rows,
91 blob_ct => ($blob_stats && $blob_stats->{blob_ct}) || 0,
92 bytes_uncomp => ($blob_stats && $blob_stats->{bytes_uncomp}) || 0,
93 bytes_comp => ($blob_stats && $blob_stats->{bytes_comp}) || 0,
94 total_refs => ($blob_stats && $blob_stats->{total_refs}) || 0,
95 ratio => (($blob_stats && $blob_stats->{bytes_uncomp}) ? sprintf('%.1fx', $blob_stats->{bytes_uncomp} / ($blob_stats->{bytes_comp} || 1)) : '-'),
96 global_ignore_pretty => $ignore_pretty,
97 global_file_type_filter => $global_ftypes,
98 global_max_file_size_bytes => $global_max_sz,
99 saved => $cgi->param('saved') ? 1 : 0,
38100};
39101my @body = $tpl->template('settings.html', $tvars);
40102MODS::PageWrapper->new->wrapper(
41103 page_title => 'Settings', page_key => 'settings',
42104 body_html => join('', @body), userinfo => { display_name => 'Operator' },
43105);