#!/usr/bin/perl #use warnings; use Data::Dumper; use strict; use DBI; use CGI; use JSON qw(decode_json); use IO::All; my $sqlconf = decode_json(io->file("/home/icxcnika/AntiSpamMeta/config-main/mysql.json")->all); my $dbh = DBI->connect("DBI:mysql:database=" . $sqlconf->{db} . ";host=" . $sqlconf->{host} . ";port=" . $sqlconf->{port}, $sqlconf->{user}, $sqlconf->{pass}); $dbh->do("SET time_zone = '+0:00';"); my $debug = 0; sub esc { my ($arg) = @_; $arg = $dbh->quote($arg); $arg =~ s/\*/%/g; $arg =~ s/_/\\_/g; $arg =~ s/\?/_/g; return $arg; } sub dottedQuadToInt { my ($dottedquad) = @_; my $ip_number = 0; my @octets = split(/\./, $dottedquad); foreach my $octet (@octets) { $ip_number <<= 8; $ip_number |= $octet; } return $ip_number; } my $cgi = CGI->new; my %data = %{$cgi->{param}}; $debug = int($data{debug}) if (defined($data{debug})); if ( !defined($data{query}) ) { print "Content-type: text/html", "\n\n"; print < AntiSpamMeta database query page

NEW: READ ME.

I'm looking to move AntiSpamMeta, and its databases, to a new server. This will cost me about \$400/year, however will allow for recursive lookups similar to stalker.pl - Finding a nick tied to a host tied to another nick tied to a nickserv account tied to a geco, etc.

This will make the most comprehensive tracking database for Freenode to date, but I need your help with the bills!

Matching is done based on field1 OR field2 OR field3 etc. Wildcards are supported, except for the realIP field, which must be blank or an IPv4 dotted quad.

HTML print ' Nickname:
\n"; print ' User:
\n"; print ' Hostname:
\n"; print ' Gecos:
\n"; print ' Account:
\n"; print ' Real IP: \n"; print <
HTML exit 0; } if ($debug) { print "Content-type: text/plain", "\n\n"; print Dumper(\%data); } else { print "Content-type: text/html", "\n\n"; print < Query results HTML } ##Queryable items: ## nick, user, host, realip, gecos, account my $qry = 'SELECT * FROM ' . $sqlconf->{actiontable} . ' WHERE '; if (defined($data{nick}) && ($data{nick}->[0] ne "*") && ($data{nick}->[0] ne "")) { $qry .= " nick like " . esc($data{nick}->[0] ) . ' or '; } if (defined($data{user}) && ($data{user}->[0] ne "*") && ($data{user}->[0] ne "")) { $qry .= ' user like ' . esc($data{user}->[0] ) . ' or '; } if (defined($data{host}) && ($data{host}->[0] ne "*") && ($data{host}->[0] ne "")) { $qry .= ' host like ' . esc($data{host}->[0] ) . ' or '; } if (defined($data{gecos}) && ($data{gecos}->[0] ne "*") && ($data{gecos}->[0] ne "")) { $qry .= ' gecos like ' . esc($data{gecos}->[0] ) . ' or '; } if (defined($data{account}) && ($data{account}->[0] ne "*") && ($data{account}->[0] ne "")) { $qry .= ' account like ' . esc($data{account}->[0] ) . ' or '; } if (defined($data{realip}) && ($data{realip}->[0] =~ /^\d+\.\d+\.\d+\.\d+$/)) { $qry .= ' ip = ' . dottedQuadToInt($data{realip}->[0] ) . ' or '; } $qry .= '(1 = 0)'; # rather than trying to get rid of a trailing 'or ' if ($debug) { print "Querying: "; print Dumper($qry); } my $sth = $dbh->prepare($qry); $sth->execute; my $names = $sth->{'NAME'}; my $numFields = $sth->{'NUM_OF_FIELDS'}; #fields are index,time,action,reason,channel,nick,user,host,ip,gecos,account,bynick,byuser,byhost,bygecos,byaccount my %f = ( "index" => 0, "time" => 1, "action" => 2, "reason" => 3, "channel" => 4, "nick" => 5, "user" => 6, "host" => 7, "ip" => 8, "gecos" => 9, "account" => 10, "bynick" => 11, "byuser" => 12, "byhost" => 13, "bygecos" => 14, "byaccount" => 15 ); print "" unless $debug; if ($debug) { for (my $i = 0; $i < $numFields; $i++) { printf("%s%s", $i ? "," : "", $$names[$i]); } } #print "" unless $debug; print "\n"; while (my $ref = $sth->fetchrow_arrayref) { #fields are index,time,action,reason,channel,nick,user,host,ip,gecos,account,bynick,byuser,byhost,bygecos,byaccount unless ($debug) { print ''; print ''; print ''; print ''; # print ''; print ''; } else { for (my $i = 0; $i < $numFields; $i++) { printf("%s%s", $i ? "," : "", $$ref[$i]); } } print "\n"; } unless ($debug) { print "
#' . $$ref[$f{'index'}] . ':' . $$ref[$f{'time'}] . '' . $$ref[$f{'nick'}] . ''; print '!' . $$ref[$f{'user'}] . '@' . $$ref[$f{'host'}] . ' (' . $$ref[$f{'gecos'}] . ')'; print ' [' . $$ref[$f{'account'}] . ']' if ($$ref[$f{'account'}] ne ''); print ''; print ' received ' . $$ref[$f{'action'}] . ''; print ' (' . $$ref[$f{'reason'}] . ')' if ($$ref[$f{'reason'}] ne ''); print ' on ' . $$ref[$f{'channel'}] if ($$ref[$f{'channel'}] ne ''); print ' '; # print ''; if ($$ref[$f{'bynick'}] ne '') { print 'by ' . $$ref[$f{'bynick'}]; print '!' . $$ref[$f{'byuser'}] . '@' . $$ref[$f{'byhost'}] . ' (' . $$ref[$f{'bygecos'}] . ')'; print ' [' . $$ref[$f{'byaccount'}] . ']' if ($$ref[$f{'byaccount'}] ne ''); print ''; } print '
"; }