#!/usr/bin/env perl # Daniel Bowling # Mar 2021 use Mojolicious::Lite; use Regexp::Common qw{net}; use Digest::SHA qw{sha1_hex}; use Number::Format qw{format_number}; # guest.cgi script plugin CGI => ['/cgi-bin/guest' => './cgi-bin/guest_mm.cgi']; # whoami.cgi script plugin CGI => ['/cgi-bin/whoami' => './cgi-bin/whoami.cgi']; # The main landing page; pass in the output of the fortune command get '/' => sub { my ($c) = @_; my $count = format_number time; # Grab epoch and add commas my $fortune = `/usr/games/fortune` || `fortune` || "huh??\n"; # Gather all our server-side stuff my %serverSide = ( count => $count, fortune => $fortune ); $c->render(%serverSide); } => 'index'; # Deprecation of IE page get '/die'; get '/me'; get '/news'; # Process mac address to ula6 ala the ol' ula6.cgi script: # - Current time of day in 64-bit NTP format # - Obtain EUI64 # - Cat first with second # - Compute SHA-1 of third and use least significant 40 bits # TODO: This ancient code could certainly be cleaned up get '/ula6' => sub { my ($c) = @_; my ($mac, $ula6); # Check the MAC $mac = ($c->param('macaddr')) ? lc $c->param('macaddr') : ''; if ($mac =~ /$RE{net}{MAC}/) { # Local vars for this bit my ( $binfield, $decfield, $digesty, $epoch, @fields, $fulleui, $halfone, $halftwo, $hexfield, $uniqueid ); # EUI64 @fields = split(/:/, $mac); $halfone = $fields[0] . $fields[1] . $fields[2] . "ff"; $halftwo = "fe" . $fields[3] . $fields[4] . $fields[5]; $binfield = sprintf "%b", hex $fields[0]; $decfield = sprintf "%d", hex $fields[0]; $decfield = ($binfield =~ /1[01]$/) ? $decfield - 2 : $decfield + 2; $hexfield = sprintf "%x", int $decfield; $halfone = $hexfield . $fields[1] . $fields[2] . "ff"; $fulleui = $halfone . $halftwo; # Current time of day $epoch = time() + 2208988800; # Cat with the time $digesty = sha1_hex($epoch . $fulleui); ($uniqueid = "fd" . substr $digesty, -10) =~ s/(.{1,4})/$1:/g; # Set the ULA $ula6 = $uniqueid . ':/48'; } $c->render(ula6 => $ula6); }; # Send it app->start();