#!/usr/bin/env perl # Daniel Bowling # Mar 2021 use Mojolicious::Lite; use Regexp::Common qw{net}; use Digest::SHA qw{sha1_hex}; # The main landing page; pass in the output of the fortune command get '/' => sub { my ($c) = @_; my $fortune = `fortune` || "huh?? no fortune for u\n"; $c->render(fortune => $fortune); } => '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 = lc $c->param('macaddr'); # Lower-case plz my $ula6; # Check the MAC 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 =~ m/1[01]$/) ? $decfield - 2 : $decfield + 2; $binfield = sprintf "%b", int $decfield; $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:/gs; # Set the ULA $ula6 = $uniqueid . ':/48'; } $c->render(ula6 => $ula6); }; # Send it app->start();