hpr-tools/Database/host_image

180 lines
5.0 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env perl
#===============================================================================
#
# FILE: host_image
#
# USAGE: ./host_image
#
# DESCRIPTION: Collects Gravatar images for HPR hosts. This version simply
# cycles through the list of hosts from the local copy of the
# database and attempts to collect the Gravatar for every one
# that has an email address and isn't marked as having a local
# image (provided via the show upload form) in the database.
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: Dave Morriss (djm), Dave.Morriss@gmail.com
# VERSION: 0.0.2
# CREATED: 2016-08-31 16:52:52
# REVISION: 2021-10-15 21:02:52
#
#===============================================================================
use 5.010;
use strict;
use warnings;
use utf8;
use Config::General;
use Digest::MD5 qw{md5_hex};
#use Digest::MD5::File qw{file_md5_hex};
use LWP::Simple;
use DBI;
#
# Version number (manually incremented)
#
our $VERSION = '0.0.2';
#
# Script name
#
( my $PROG = $0 ) =~ s|.*/||mx;
( my $DIR = $0 ) =~ s|/?[^/]*$||mx;
$DIR = '.' unless $DIR;
#-------------------------------------------------------------------------------
# Declarations
#-------------------------------------------------------------------------------
#
# Constants and other declarations
#
my $basedir = "$ENV{HOME}/HPR/Database";
my $configfile = "$basedir/.hpr_db.cfg";
my $imgpath = "$basedir/www/images/hosts/%s.png";
my $urlformat = 'https://secure.gravatar.com/avatar/%s.png?d=404&s=90';
my ( $dbh, $sth1, $h1, $rv );
my ( $host, $hostid, $email, $grav_url, $img, $res );
#
# Enable Unicode mode
#
binmode STDOUT, ":encoding(UTF-8)";
binmode STDERR, ":encoding(UTF-8)";
#
# Load configuration data
#
my $conf = new Config::General(
-ConfigFile => $configfile,
-InterPolateVars => 1,
-ExtendedAccess => 1
);
my %config = $conf->getall();
#-------------------------------------------------------------------------------
# Connect to the database
# 2021-10-15: moved to MariaDB
#-------------------------------------------------------------------------------
my $dbhost = $config{database}->{host} // '127.0.0.1';
my $dbport = $config{database}->{port} // 3306;
my $dbname = $config{database}->{name};
my $dbuser = $config{database}->{user};
my $dbpwd = $config{database}->{password};
$dbh = DBI->connect( "DBI:MariaDB:host=$dbhost;port=$dbport;database=$dbname",
$dbuser, $dbpwd, { AutoCommit => 1, RaiseError => 1 } )
or die $DBI::errstr;
#
# Enable client-side UTF8 (MySQL only)
#
# $dbh->{mysql_enable_utf8} = 1;
#-------------------------------------------------------------------------------
# Prepare SQL for finding hosts
#-------------------------------------------------------------------------------
$sth1 = $dbh->prepare(
q{SELECT host, hostid, email FROM hosts
WHERE valid = '1' AND local_image = '0'
ORDER BY hostid ASC}
);
$sth1->execute;
if ( $dbh->err ) {
die $dbh->errstr;
}
#-------------------------------------------------------------------------------
# Loop through the hosts gathering gravatars
#-------------------------------------------------------------------------------
while ( $h1 = $sth1->fetchrow_hashref ) {
$host = $h1->{host};
$hostid = $h1->{hostid};
$email = $h1->{email};
#
# We need an email address
#
next unless ($email);
$res = fetch( $hostid, $host, $email, $urlformat, $imgpath );
}
$sth1->finish;
$dbh->disconnect;
exit;
#=== FUNCTION ================================================================
# NAME: fetch
# PURPOSE: Perform the fetching and saving of a gravatar image
# PARAMETERS: $hostid - host number from database
# $host - host name from database
# $email - email address from database
# $urlformat - template for building the gravatar URL
# $imgpath - template for building the file path
# RETURNS: Nothing
# DESCRIPTION: Uses LWP to collect the gravatar image using the URL
# constructed from a template and the email address, writes it
# to the constructed file path.
# THROWS: No exceptions
# COMMENTS: None
# SEE ALSO: N/A
#===============================================================================
sub fetch {
my ( $hostid, $host, $email, $urlformat, $imgpath ) = @_;
#
# Build the URL and the image file path
#
my $grav_url = sprintf( $urlformat, md5_hex( lc($email) ) );
my $img = sprintf( $imgpath, $hostid );
printf "%3d: %s (%s) %s %s - ", $hostid, $host, $email, $grav_url, $img;
#
# Collect the gravatar if there is one
#
my $res = getstore( $grav_url, $img );
#
# Remove any garbage
#
if ( $res != 200 ) {
print "Failed ($res)\n";
unlink($img);
return 0;
}
else {
print "OK\n";
return 1;
}
}
# vim: syntax=perl:ts=8:sw=4:et:ai:tw=78:fo=tcrqn21:fdm=marker