#!/usr/bin/env perl
# Daniel Bowling
# Feb 2020
# version 0.11 - update $ver @ line 50
use strict;
use warnings;
use Net::HTTP;
use Getopt::Long qw(:config no_ignore_case);
sub get_cp {
# make the request
my $s = Net::HTTP->new(
'Host' => "@_"
) || die $@;
$s->write_request(
'HEAD' => "/",
'Pragma' => "akamai-x-get-cache-key"
);
# read the headers
my @ckey;
while (my $line = <$s>) {
# find the cache key header
if ($line =~ /X-Cache-Key:/) {
@ckey = split(/\//, $line); # Split ckey by forward-slash
last; # Break out of loop after split
}
}
# return cache key or question mark if error
if (@ckey) {
return $ckey[3]
} else {
return "?"
}
}
# Parse options
GetOptions(
'delimiter|d=s' => \my $sep,
'header|H' => \my $head,
'help|h', # technically does nothing right now
'version|v' => \my $ver
);
# Version info option
if ($ver) {
$ver = '0.11';
print "$ver\n";
exit;
}
# Choose what to do given args, STDIN, or null
if (@ARGV) {
@_ = @ARGV # use args or...
} elsif (! -t STDIN) {
chomp (@_ = ) # use STDIN or...
} else {
print "Usage: $0 \n\n"; # null, print help
die <<'OPTIONS';
Find CP code from hostnames provided as arguments or STDIN.
-d, --delimiter=DELIM Change delimiting character (default is TAB)
-H, --header Print header with output lines
-h, --help Print this help message
-v, --version Print version
OPTIONS
}
# Delimiter character
$sep = "\t" if ! $sep;
# Print header if -H|--header is specified
print "Hostname${sep}CP Code\n" if $head;
# Begin parsing hostnames
for (@_) {
# print hostname, delimiter, CP code and newline
print $_ . $sep . get_cp($_) . "\n";
}