From 16b3cd4ae71bfb9d0e8a17eedf843134326666cc Mon Sep 17 00:00:00 2001 From: Emil Williams Date: Wed, 20 Aug 2025 13:13:46 +0000 Subject: This Almost Certainly Doesn't Work. --- gorillanest | 17 +++++++---------- template/index.tt | 1 + 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/gorillanest b/gorillanest index b361068..ae86e60 100755 --- a/gorillanest +++ b/gorillanest @@ -11,6 +11,7 @@ use Sys::Syslog; use Template; use URI::Escape; use Cwd; +use Git::Repository; use Data::Dumper; sub info { @@ -33,17 +34,16 @@ sub GN::directories { return \@directories; } -# probably should output all repos recursively, currently just outputs list of users sub GN::index { # / my ($root, $dataref) = @_; my %data = %$dataref; - my @directories = map { my $i = $_; map { join('/', $i, $_) } @{GN::directories(join('/', $root, $i))} } @{GN::directories($root)}; - $data{directories} = \@directories; + my @users = @{GN::directories($root)}; + my @directories = map { my $i = $_; map { join('/', $i, $_) } @{GN::directories(join('/', $root, $i))} } @users; if ($data{directories}) { $data{found} = 1; } return \%data; } -sub GN::user { # /$username/ +sub GN::user { # /$username my ($root, $dataref) = @_; my %data = %$dataref; my @directories = @{GN::directories(join('/', $root, $data{username}))}; @@ -55,12 +55,7 @@ sub GN::user { # /$username/ sub GN::repository { # /$username/$repository my ($root, $dataref) = @_; my %data = %$dataref; - my $d = getcwd(); - chdir(join('/', $root, $data{username}, $data{repository})); - warn 'sneed ' . getcwd() . "\n"; - $data{log} = Dumper(split(/\n/, qx(git log --pretty=format:\'%H | %an | %ad | %s%x0a\'))); # It technically works # | tac | tr -s \'\n\' - chdir($d); - $data{found} = 1; + # one day return \%data; } @@ -70,12 +65,14 @@ try { my $dbfile = 'gorillanest.sqlite3'; my %data = ( found => 0, + access => 0, ); my $request = FCGI::Request(); my $template = Template->new({INCLUDE_PATH => 'template'}); my $head = 0; my $a_template; while($request->Accept() >= 0) { + $data{access} += 1; my $cgi = CGI->new; my %header = ( -Content_Type => 'text/html', diff --git a/template/index.tt b/template/index.tt index 6c018d8..aa48b16 100644 --- a/template/index.tt +++ b/template/index.tt @@ -6,6 +6,7 @@

[% title %]

[% description %]

+

one million [% access %] xolatile's

[% INCLUDE foot.tt %] -- cgit v1.2.3 From f36c1fe8ed9ccc82eda0cd5c031bd1ab00f2e096 Mon Sep 17 00:00:00 2001 From: Emil Williams Date: Wed, 20 Aug 2025 13:17:01 +0000 Subject: Yeah, No, Yeah, No --- gorillanest | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/gorillanest b/gorillanest index ae86e60..41e5c34 100755 --- a/gorillanest +++ b/gorillanest @@ -11,7 +11,7 @@ use Sys::Syslog; use Template; use URI::Escape; use Cwd; -use Git::Repository; +# use Git::Repository; use Data::Dumper; sub info { @@ -34,16 +34,17 @@ sub GN::directories { return \@directories; } +# probably should output all repos recursively, currently just outputs list of users sub GN::index { # / my ($root, $dataref) = @_; my %data = %$dataref; - my @users = @{GN::directories($root)}; - my @directories = map { my $i = $_; map { join('/', $i, $_) } @{GN::directories(join('/', $root, $i))} } @users; + my @directories = map { my $i = $_; map { join('/', $i, $_) } @{GN::directories(join('/', $root, $i))} } @{GN::directories($root)}; + $data{directories} = \@directories; if ($data{directories}) { $data{found} = 1; } return \%data; } -sub GN::user { # /$username +sub GN::user { # /$username/ my ($root, $dataref) = @_; my %data = %$dataref; my @directories = @{GN::directories(join('/', $root, $data{username}))}; @@ -55,7 +56,7 @@ sub GN::user { # /$username sub GN::repository { # /$username/$repository my ($root, $dataref) = @_; my %data = %$dataref; - # one day + $data{found} = 0; return \%data; } -- cgit v1.2.3 From fd209e3f2564897f209da0ab1bb15000fa63e09d Mon Sep 17 00:00:00 2001 From: Emil Williams Date: Wed, 20 Aug 2025 13:27:58 +0000 Subject: I'm Going To Personally Ensure This Explodes Horribly --- gorillanest | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gorillanest b/gorillanest index 41e5c34..300731d 100755 --- a/gorillanest +++ b/gorillanest @@ -61,6 +61,7 @@ sub GN::repository { # /$username/$repository } openlog("gorillanest", "ndelay,pid", Sys::Syslog::LOG_DAEMON); +my $sock = FCGI::OpenSocket('/tmp/gorillanest.socket', 100); try { my $public = 'git/public'; my $dbfile = 'gorillanest.sqlite3'; @@ -68,7 +69,8 @@ try { found => 0, access => 0, ); - my $request = FCGI::Request(); + + my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $sock); my $template = Template->new({INCLUDE_PATH => 'template'}); my $head = 0; my $a_template; @@ -111,3 +113,4 @@ try { } catch ($error) { info("Crashed: $error"); } +FCGI::CloseSocket($sock); -- cgit v1.2.3 From ca0ab632948470e576e8ea1385499c577fd03422 Mon Sep 17 00:00:00 2001 From: Emil Williams Date: Wed, 20 Aug 2025 13:48:19 +0000 Subject: Perfection Assured The First Time --- git/private/.gitkeep | 0 git/public/.gitkeep | 0 gorillanest | 5 ++--- 3 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 git/private/.gitkeep create mode 100644 git/public/.gitkeep diff --git a/git/private/.gitkeep b/git/private/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/git/public/.gitkeep b/git/public/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/gorillanest b/gorillanest index 300731d..f5c26f7 100755 --- a/gorillanest +++ b/gorillanest @@ -7,7 +7,6 @@ use CGI; use FCGI; use Switch::Back; use Syntax::Keyword::Try; -use Sys::Syslog; use Template; use URI::Escape; use Cwd; @@ -15,7 +14,7 @@ use Cwd; use Data::Dumper; sub info { - syslog("info", join(' ', @_)); + warn join(' ', @_); } # significant dirs only @@ -60,7 +59,7 @@ sub GN::repository { # /$username/$repository return \%data; } -openlog("gorillanest", "ndelay,pid", Sys::Syslog::LOG_DAEMON); +open STDERR, '>', '/tmp/gorillanest.log' or die "You Will Never Ever See This Message Hopefully: $!"; my $sock = FCGI::OpenSocket('/tmp/gorillanest.socket', 100); try { my $public = 'git/public'; -- cgit v1.2.3 From cc04457c99952083ee095d6eae069cb5d8307837 Mon Sep 17 00:00:00 2001 From: Emil Williams Date: Wed, 20 Aug 2025 14:23:06 +0000 Subject: Gorillas Break Down Your House And Sell It Wholesale --- .gitignore | 1 + config.pl.example | 6 +++ gorillanest | 115 --------------------------------------------------- gorillanest.pl | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 115 deletions(-) create mode 100644 config.pl.example delete mode 100755 gorillanest create mode 100755 gorillanest.pl diff --git a/.gitignore b/.gitignore index 0c4032e..ee90409 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.sqlite3 +config.pl git/* !git/public/.gitkeep !git/private/.gitkeep diff --git a/config.pl.example b/config.pl.example new file mode 100644 index 0000000..fd39608 --- /dev/null +++ b/config.pl.example @@ -0,0 +1,6 @@ +# always assume anything to do with files is from project root +use constant GIT_ROOT => 'git'; # directory containing all browsable $users/$repositories +use constant DB_FILE => 'gorillanest.sqlite3'; # sqlite3 database file location +use constant TEMPLATE_ROOT => 'template'; # template directory +use constant USER_REPOSITORY => qr{^/([a-zA-Z0-9_.]+)(?:/([a-zA-Z0-9_.]+))?}; # $1 = username, $2 = repository fullname +1; diff --git a/gorillanest b/gorillanest deleted file mode 100755 index f5c26f7..0000000 --- a/gorillanest +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env perl - -use strict; -use warnings; - -use CGI; -use FCGI; -use Switch::Back; -use Syntax::Keyword::Try; -use Template; -use URI::Escape; -use Cwd; -# use Git::Repository; - -use Data::Dumper; -sub info { - warn join(' ', @_); -} - -# significant dirs only -sub GN::directories { - my $root = $_[0]; - opendir my $dir, $root or die "Cannot open directory: $!"; - my @directories; - my %drop = ( - '.' => 0, - '..' => 0, - ); - foreach (readdir $dir) { - push(@directories, $_) if (-d join('/', $_[0], $_) && ($drop{$_} // 1)); - } - closedir $dir; - return \@directories; -} - -# probably should output all repos recursively, currently just outputs list of users -sub GN::index { # / - my ($root, $dataref) = @_; - my %data = %$dataref; - my @directories = map { my $i = $_; map { join('/', $i, $_) } @{GN::directories(join('/', $root, $i))} } @{GN::directories($root)}; - $data{directories} = \@directories; - if ($data{directories}) { $data{found} = 1; } - return \%data; -} - -sub GN::user { # /$username/ - my ($root, $dataref) = @_; - my %data = %$dataref; - my @directories = @{GN::directories(join('/', $root, $data{username}))}; - $data{directories} = \@directories; - if ($data{directories}) { $data{found} = 1; } - return \%data; -} - -sub GN::repository { # /$username/$repository - my ($root, $dataref) = @_; - my %data = %$dataref; - $data{found} = 0; - return \%data; -} - -open STDERR, '>', '/tmp/gorillanest.log' or die "You Will Never Ever See This Message Hopefully: $!"; -my $sock = FCGI::OpenSocket('/tmp/gorillanest.socket', 100); -try { - my $public = 'git/public'; - my $dbfile = 'gorillanest.sqlite3'; - my %data = ( - found => 0, - access => 0, - ); - - my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $sock); - my $template = Template->new({INCLUDE_PATH => 'template'}); - my $head = 0; - my $a_template; - while($request->Accept() >= 0) { - $data{access} += 1; - my $cgi = CGI->new; - my %header = ( - -Content_Type => 'text/html', - -charset => 'UTF-8', - ); - my $method = $ENV{'REQUEST_METHOD'} || ''; - my $uri = $ENV{'REQUEST_URI'} || '/'; - if ($method eq 'HEAD') { - $head = 1; - } elsif ($method eq 'GET') { - ($data{username}, $data{repository}) = $uri =~ m{^/([a-zA-Z0-9_.]+)(?:/([a-zA-Z0-9_.]+))?}; - info("name:", $data{username} || '', "repo:", $data{repository} || ''); - if ($uri eq '/') { - %data = %{GN::index($public, \%data)}; - $a_template = "index.tt"; - } elsif ($data{repository}) { - %data = %{GN::repository($public, \%data)}; - $a_template = "repository.tt"; - } elsif ($data{username}) { - %data = %{GN::user($public, \%data)}; - $a_template = "index_user.tt"; - } - if (!$data{found}) { - $header{-status} = '404 Not Found'; - $a_template = "404.tt"; - } - print $cgi->header(%header); - if ($head) { $head = 0; continue; } - $template->process($a_template, \%data) or info("Template: " . $template->error()); - } else { - $header{-status} = '405 Method Not Allowed'; - print $cgi->header(%header); - } - } -} catch ($error) { - info("Crashed: $error"); -} -FCGI::CloseSocket($sock); diff --git a/gorillanest.pl b/gorillanest.pl new file mode 100755 index 0000000..53d3a9d --- /dev/null +++ b/gorillanest.pl @@ -0,0 +1,121 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use CGI; +use FCGI; +use Switch::Back; +use Syntax::Keyword::Try; +use Template; +use URI::Escape; +use Cwd; +use Data::Dumper; +use Git::Repository; + +use lib '.'; +BEGIN { require 'config.pl'; } + +sub info { + warn join(' ', @_); +} + +# significant dirs only +sub GN::directories { + my $root = $_[0]; + opendir my $dir, $root or die "Cannot open directory: $!"; + my @directories; + my %drop = ( + '.' => 0, + '..' => 0, + ); + foreach (readdir $dir) { + push(@directories, $_) if (-d join('/', $_[0], $_) && ($drop{$_} // 1)); + } + closedir $dir; + return \@directories; +} + +# probably should output all repos recursively, currently just outputs list of users +sub GN::index { # / + my ($root, $dataref) = @_; + my %data = %$dataref; + my @directories = map { my $i = $_; map { join('/', $i, $_) } @{GN::directories(join('/', $root, $i))} } @{GN::directories($root)}; + $data{directories} = \@directories; + if ($data{directories}) { $data{found} = 1; } + return \%data; +} + +sub GN::user { # /$username/ + my ($root, $dataref) = @_; + my %data = %$dataref; + my @directories = @{GN::directories(join('/', $root, $data{username}))}; + $data{directories} = \@directories; + if ($data{directories}) { $data{found} = 1; } + return \%data; +} + +sub GN::repository { # /$username/$repository + my ($root, $dataref) = @_; + my %data = %$dataref; + $data{found} = 0; + return \%data; +} + +sub GN::main { + open STDERR, '>', '/tmp/gorillanest.log' or die "You Will Never Ever See This Message Hopefully: $!"; + my $sock = FCGI::OpenSocket('/tmp/gorillanest.socket', 100); + try { + my $root = GIT_ROOT; + my $dbfile = DB_FILE; + my %data = ( + found => 0, + access => 0, + ); + + my $request = FCGI::Request(\*STDIN, \*STDOUT, \*STDERR, \%ENV, $sock); + my $template = Template->new({INCLUDE_PATH => TEMPLATE_ROOT}); + my $head = 0; + my $a_template; + while($request->Accept() >= 0) { + $data{access} += 1; + my $cgi = CGI->new; + my %header = ( + -Content_Type => 'text/html', + -charset => 'UTF-8', + ); + my $method = $ENV{'REQUEST_METHOD'} || ''; + my $uri = $ENV{'REQUEST_URI'} || '/'; + if ($method eq 'HEAD') { + $head = 1; + } elsif ($method eq 'GET') { + ($data{username}, $data{repository}) = $uri =~ USER_REPOSITORY; + info("name:", $data{username} || '', "repo:", $data{repository} || ''); + if ($uri eq '/') { + %data = %{GN::index($root, \%data)}; + $a_template = "index.tt"; + } elsif ($data{repository}) { + %data = %{GN::repository($root, \%data)}; + $a_template = "repository.tt"; + } elsif ($data{username}) { + %data = %{GN::user($root, \%data)}; + $a_template = "index_user.tt"; + } + if (!$data{found}) { + $header{-status} = '404 Not Found'; + $a_template = "404.tt"; + } + print $cgi->header(%header); + if ($head) { $head = 0; continue; } + $template->process($a_template, \%data) or info("Template: " . $template->error()); + } else { + $header{-status} = '405 Method Not Allowed'; + print $cgi->header(%header); + } + } + } catch ($error) { + info("Crashed: $error"); + } + FCGI::CloseSocket($sock); +} + +GN::main(); -- cgit v1.2.3