diff options
Diffstat (limited to '_site/log/search-with-cgi')
| -rw-r--r-- | _site/log/search-with-cgi/index.html | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/_site/log/search-with-cgi/index.html b/_site/log/search-with-cgi/index.html new file mode 100644 index 0000000..060a282 --- /dev/null +++ b/_site/log/search-with-cgi/index.html @@ -0,0 +1,152 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <title>Site search using Perl + CGI</title> + + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Site search using Perl + CGI</title> + <link rel="stylesheet" href="/assets/css/main.css"> + <link rel="stylesheet" href="/assets/css/skeleton.css"> +</head> + + + + </head> + <body> + + <div id="nav-container" class="container"> + <ul id="navlist" class="left"> + + <li > + <a href="/" class="link-decor-none">hme</a> + </li> + <li class="active"> + <a href="/log/" class="link-decor-none">log</a> + </li> + <li > + <a href="/projects/" class="link-decor-none">poc</a> + </li> + <li > + <a href="/about/" class="link-decor-none">abt</a> + </li> + <li> + <a href="/cgi-bin/find.cgi" class="link-decor-none">sws</a> + </li> + <li> + <a href="/feed.xml" class="link-decor-none">rss</a> + </li> + </ul> +</div> + + + + <main> + <div class="container"> + <div class="container-2"> + <h2 class="center" id="title">SITE SEARCH USING PERL + CGI</h2> + <h6 class="center">29 DECEMBER 2025</h5> + <br> + <div class="twocol justify"><p>Need a way to search site–number of articles are growing.</p> + +<p>Searching site client-side using the RSS feed and JavaScript is not an option– +bloats the feed and breaks the site for Lynx and other text browsers.</p> + +<p>Perl’s great for text processing–especially regex work. Few lines of Perl +could do a regex search and send the result back via CGI. OpenBSD httpd speaks +CGI, Perl and slowcgi are in the base systems. No dependencies. Works on every +conceivable browser.</p> + +<p>Perl: traverse the directory with File::Find recursively. If search text is +found grab the file name, title and up to 50 chars of the first paragraph to +include in the search result.</p> + +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find(sub { + if (open my $fh, '<', $_) { + my $content = do { local $/; <$fh> }; + close $fh; + + if ($content =~ /\Q$search_text\E/i) { + my ($title) = $content =~ /<title>(.*?)<\/title>/is; + $title ||= $File::Find::name; + my ($p_content) = $content =~ /<p[^>]*>(.*?)<\/p>/is; + my $snippet = $p_content || ""; + $snippet =~ s/<[^>]*>//g; + $snippet =~ s/\s+/ /g; + $snippet = substr($snippet, 0, 50); + $snippet .= "..." if length($p_content || "") > 50; + + push @results, { + path => $File::Find::name, + title => $title, + snippet => $snippet + }; + } + } +}, $dir); +</code></pre></div></div> + +<p>Don’t need the Perl CGI module, httpd sets QUERY_STRING for the slowcgi script:</p> + +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>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; + } +} +</code></pre></div></div> + +<p>Run the script as www user. Permissions: 554 (read + execute).</p> + +<p>Running in OpenBSD chroot: Check Perl’s dynamic object dependencies:</p> + +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ldd $(which perl) +/usr/bin/perl: + Start End Type Open Ref GrpRef Name + 000008797e8e6000 000008797e8eb000 exe 1 0 0 /usr/bin/perl + 0000087c1ffe5000 0000087c20396000 rlib 0 1 0 /usr/lib/libperl.so.26.0 + 0000087bf4508000 0000087bf4539000 rlib 0 2 0 /usr/lib/libm.so.10.1 + 0000087b9e801000 0000087b9e907000 rlib 0 2 0 /usr/lib/libc.so.102.0 + 0000087bba182000 0000087bba182000 ld.so 0 1 0 /usr/libexec/ld.so +</code></pre></div></div> + +<p>Copy them over to chroot. Now should have /var/www/usr/bin/perl, +/usr/lib/libperl.so.26.0, and so on.</p> + +<p>Troubleshooting: look for issues in logs or try executing the script in chroot:</p> + +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ cat /var/log/messages | grep slowcgi +# chroot /var/www/ htdocs/path/to/script/script.cgi +</code></pre></div></div> +<p>The last command exposes any missing Perl modules in chroot and where to find +them. Copy them over as well.</p> + +<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>location "/cgi-bin/*" { + fastcgi socket "/run/slowcgi.sock" +} +</code></pre></div></div> + +<p>in httpd.conf routes queries to slowcgi.</p> + +</div> + <p class="post-author right">by W. D. Sadeep Madurange</p> + </div> + </div> + </main> + + <div class="footer"> + <div class="container"> + <div class="twelve columns right container-2"> + <p id="footer-text">© ASCIIMX - 2025</p> + </div> + </div> +</div> + + + </body> +</html> |
