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

O Operator
Diff

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

modified on local at 2026-07-12 00:19:40

Added
+9
lines
Removed
-2
lines
Context
105
unchanged
Blobs
from f9cb5afdbf95
to c958968f6b22
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
22#======================================================================
33# DriftSense -- /named_releases.cgi
44#
55# List + create named releases. Each release is a bookmark that pins
66# every blob referenced by FILE_CHANGES rows in a chosen scope. A
77# release can be portfolio-wide (scope_monitor_id NULL) or scoped to
88# a single site (scope_monitor_id set). Pinned blobs are exempt from
99# auto-purge.
1010#======================================================================
1111use strict;
1212use warnings;
1313use CGI ();
1414use MODS::Config; use MODS::DBConnect; use MODS::Template; use MODS::PageWrapper;
1515my $cgi = CGI->new; my $db = MODS::DBConnect->new; my $tpl = MODS::Template->new;
1616$|=1;
1717
1818my $dbh = $db->db_connect or die "DB connect failed\n";
1919
2020# ---- POST: create ---------------------------------------------------
2121if (($ENV{REQUEST_METHOD} || '') eq 'POST' && $cgi->param('save')) {
2222 my $name = $cgi->param('name') || '';
2323 my $desc = $cgi->param('description') || '';
2424 my $by = $cgi->param('released_by') || 'Operator';
2525 my $scope_mid = int($cgi->param('scope_monitor_id') || 0);
2626 my $scope_sid = int($cgi->param('scope_server_id') || 0);
27 my $dkind = $cgi->param('alert_delivery_kind') || 'none';
28 $dkind = 'none' unless $dkind =~ /^(none|generic_webhook|slack|discord)$/;
29 my $durl = $cgi->param('alert_delivery_url') || '';
2730
2831 if (length $name) {
2932 my $q_name = $dbh->quote($name);
3033 my $q_desc = $dbh->quote($desc);
3134 my $q_by = $dbh->quote($by);
35 my $q_dk = $dbh->quote($dkind);
36 my $q_du = $dbh->quote($durl);
3237 my $mid_expr = $scope_mid ? $scope_mid : 'NULL';
3338 my $sid_expr = $scope_sid ? $scope_sid : 'NULL';
3439 $db->db_readwrite($dbh, qq~
3540 INSERT INTO NAMED_RELEASES
3641 (name, description, released_at, released_by, is_locked, created_at,
37 scope_monitor_id, scope_server_id)
42 scope_monitor_id, scope_server_id,
43 alert_delivery_kind, alert_delivery_url)
3844 VALUES
3945 ($q_name, $q_desc, NOW(), $q_by, 1, NOW(),
40 $mid_expr, $sid_expr)
46 $mid_expr, $sid_expr,
47 $q_dk, $q_du)
4148 ~, __FILE__, __LINE__);
4249 }
4350 print "Status: 302 Found\nLocation: /named_releases.cgi\n\n"; exit;
4451}
4552
4653print "Content-Type: text/html; charset=utf-8\nCache-Control: no-cache\n\n";
4754
4855# ---- Existing releases + count how many blobs each pins -------------
4956my @rows = $db->db_readwrite_multiple($dbh, q~
5057 SELECT nr.named_release_id AS id, nr.name, nr.description,
5158 DATE_FORMAT(nr.released_at, '%b %d, %Y %H:%i') AS released_h,
5259 UNIX_TIMESTAMP(nr.released_at) AS released_epoch,
5360 nr.released_by, nr.is_locked,
5461 nr.scope_monitor_id, nr.scope_server_id,
5562 m.scan_name, s.server_name
5663 FROM NAMED_RELEASES nr
5764 LEFT JOIN FILE_MONITOR_SETTINGS m ON m.file_monitor_list_id = nr.scope_monitor_id
5865 LEFT JOIN SERVERS s ON s.server_id = nr.scope_server_id
5966 ORDER BY nr.released_at DESC
6067 LIMIT 100
6168~, __FILE__, __LINE__);
6269foreach my $r (@rows) {
6370 $r->{lock_pill} = $r->{is_locked} ? 'pill-ok' : 'pill-mute';
6471 $r->{lock_lbl} = $r->{is_locked} ? 'PROTECTED' : 'UNLOCKED';
6572 $r->{released_epoch} //= 0;
6673 if ($r->{scope_monitor_id}) {
6774 $r->{scope_pill} = 'pill-info';
6875 $r->{scope_lbl} = 'per-site';
6976 $r->{scope_h} = $r->{scan_name} || "monitor #$r->{scope_monitor_id}";
7077 } elsif ($r->{scope_server_id}) {
7178 $r->{scope_pill} = 'pill-info';
7279 $r->{scope_lbl} = 'per-server';
7380 $r->{scope_h} = $r->{server_name} || "server #$r->{scope_server_id}";
7481 } else {
7582 $r->{scope_pill} = 'pill-mute';
7683 $r->{scope_lbl} = 'portfolio';
7784 $r->{scope_h} = 'All monitored sites';
7885 }
7986}
8087
8188# ---- All monitors + servers for scope picker ------------------------
8289my @monitors = $db->db_readwrite_multiple($dbh, q~
8390 SELECT m.file_monitor_list_id AS mid, m.scan_name, s.server_name
8491 FROM FILE_MONITOR_SETTINGS m
8592 LEFT JOIN SERVERS s ON s.server_id = m.server_id
8693 WHERE m.status = 1
8794 ORDER BY s.server_id ASC, m.file_monitor_list_id ASC
8895~, __FILE__, __LINE__);
8996foreach my $m (@monitors) {
9097 $m->{label} = ($m->{scan_name} // '?') . ' (on ' . ($m->{server_name} // '?') . ')';
9198}
9299
93100my $total = scalar @rows;
94101$db->db_disconnect($dbh);
95102
96103my $tvars = {
97104 rows => \@rows,
98105 has_rows => $total ? 1 : 0,
99106 total => $total,
100107 monitors => \@monitors,
101108 has_monitors=> scalar(@monitors) ? 1 : 0,
102109};
103110my @body = $tpl->template('named_releases.html', $tvars);
104111MODS::PageWrapper->new->wrapper(
105112 page_title => 'Named releases', page_key => 'named_releases',
106113 body_html => join('', @body), userinfo => { display_name => 'Operator' },
107114);