summaryrefslogtreecommitdiffstats
path: root/_site/cgi-bin/find_file.cgi
diff options
context:
space:
mode:
Diffstat (limited to '_site/cgi-bin/find_file.cgi')
-rw-r--r--_site/cgi-bin/find_file.cgi143
1 files changed, 143 insertions, 0 deletions
diff --git a/_site/cgi-bin/find_file.cgi b/_site/cgi-bin/find_file.cgi
new file mode 100644
index 0000000..2ffb808
--- /dev/null
+++ b/_site/cgi-bin/find_file.cgi
@@ -0,0 +1,143 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use File::Find;
+use Time::HiRes qw(gettimeofday tv_interval);
+use BSD::Resource; # For memory and granular CPU usage
+
+# 1. Start Benchmark Timer
+my $start_time = [gettimeofday];
+
+sub escape_html {
+ my $str = shift;
+ return "" unless defined $str;
+ $str =~ s/&/&/g;
+ $str =~ s/</&lt;/g;
+ $str =~ s/>/&gt;/g;
+ $str =~ s/"/&quot;/g;
+ $str =~ s/'/&#39;/g;
+ return $str;
+}
+
+my %params;
+if ($ENV{QUERY_STRING}) {
+ foreach my $pair (split /&/, $ENV{QUERY_STRING}) {
+ my ($key, $value) = split /=/, $pair;
+ $value =~ tr/+/ /;
+ $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+ $params{$key} = $value;
+ }
+}
+
+my $search_text = $params{'q'} || '';
+$search_text = substr($search_text, 0, 64);
+$search_text =~ s/[^a-zA-Z0-9 ]//g;
+
+my $directory = '../log/';
+my @results;
+
+my %excluded_files = (
+ 'index.html' => 1,
+);
+
+# Track IO operations (simple count)
+my $files_read = 0;
+
+if ($search_text =~ /\S/) {
+ find({
+ wanted => sub {
+ return unless -f $_ && $_ eq 'index.html';
+ my $rel_path = $File::Find::name;
+ $rel_path =~ s|^\Q$directory\E/?||;
+ return if $excluded_files{$rel_path};
+
+ if (open my $fh, '<', $_) {
+ $files_read++; # Tracking IO
+ my $content = do { local $/; <$fh> };
+ close $fh;
+
+ if ($content =~ /\Q$search_text\E/i) {
+ my ($title) = $content =~ /<title>(.*?)<\/title>/is;
+ $title = $title ? escape_html($title) : $rel_path;
+ my ($p_content) = $content =~ /<p[^>]*>(.*?)<\/p>/is;
+ my $snippet = $p_content || "";
+ $snippet =~ s/<[^>]*>//g;
+ $snippet =~ s/\s+/ /g;
+
+ $snippet = escape_html(substr($snippet, 0, 50));
+ $snippet .= "..." if length($p_content || "") > 50;
+
+ push @results, {
+ path => $File::Find::name,
+ title => $title,
+ snippet => $snippet
+ };
+ }
+ }
+ },
+ no_chdir => 0,
+ follow => 0,
+ }, $directory);
+}
+
+# --- 2. Calculate Metrics ---
+my $end_time = [gettimeofday];
+my $elapsed = tv_interval($start_time, $end_time);
+
+# CPU & RAM Usage via BSD::Resource
+my $rusage = getrusage();
+my $user_cpu = $rusage->utime; # User CPU time
+my $system_cpu = $rusage->stime; # System CPU time
+my $max_rss = $rusage->maxrss; # Peak RAM (usually in KB on Linux)
+
+# --- 3. Output ---
+print "Content-Type: text/html\n\n";
+
+my $list;
+if ($search_text eq '') {
+ $list = "<p>Please enter a search term above.</p>";
+} elsif (@results == 0) {
+ $list = "<p>No results found for \"<b>$search_text</b>\".</p>";
+} else {
+ $list = "<ul>";
+ foreach my $res (@results) {
+ my $url = $res->{path};
+ $list .= "<li><a href=\"/$url\">$res->{title}</a><br><small>$res->{snippet}</small></li>";
+ }
+ $list .= "</ul>";
+}
+
+my $safe_search_text = escape_html($search_text);
+
+print <<"HTML";
+<!DOCTYPE html>
+<html lang="en-us">
+<head>
+ <meta charset="utf-8">
+ <title>Search Results</title>
+ <style>
+ .stats { background: #f4f4f4; padding: 10px; border-radius: 5px; font-family: monospace; font-size: 0.85em; margin-top: 20px; border: 1px solid #ddd; }
+ </style>
+</head>
+<body>
+ <div class="container">
+ <h2>Search</h2>
+ <form action="" method="GET">
+ <input type="text" name="q" value="$safe_search_text">
+ <input type="submit" value="Search">
+ </form>
+ $list
+
+ <div class="stats">
+ <strong>Performance Metrics:</strong><br>
+ Total Time: @{[ sprintf("%.4f", $elapsed) ]} seconds<br>
+ User CPU: $user_cpu s<br>
+ System CPU: $system_cpu s<br>
+ Peak RAM: $max_rss KB<br>
+ Files Read: $files_read (IO Activity)
+ </div>
+ </div>
+</body>
+</html>
+HTML