Files
Bradley Giesbrecht 4b9b33446b mail/sqlgrey:
- Make database table names configurable.

git-svn-id: https://svn.macports.org/repository/macports/trunk/dports@98805 d073be05-634f-4543-b044-5fe20cf6d1d6
2012-10-17 05:44:55 +00:00

969 lines
42 KiB
Diff

diff -ur a/etc/sqlgrey.conf b/etc/sqlgrey.conf
--- a/etc/sqlgrey.conf 2011-11-30 07:53:59.000000000 -0800
+++ b/etc/sqlgrey.conf 2011-11-30 08:01:06.000000000 -0800
@@ -142,6 +142,17 @@
# Valid options: on/off. If set to 'on', clustering will be enabled.
# db_cluster = on
+## Database table names
+# db_table_temp = temp
+# db_table_connect = connect
+# db_table_from_awl = from_awl
+# db_table_domain_awl = domain_awl
+# db_table_optin_domain = optin_domain
+# db_table_optin_email = optin_email
+# db_table_optout_domain = optout_domain
+# db_table_optout_email = optout_email
+# db_table_config = config
+
#
# Comma seperated list of read-only db-servers.
# read_hosts= slave-db-1.test.com, slave-db-2.test.com ,slave-db-3.test.com
Only in b: patch-etc-sqlgrey.conf.diff
Only in b: patch-sqlgrey.diff
diff -ur a/sqlgrey b/sqlgrey
--- a/sqlgrey 2011-11-30 07:53:59.000000000 -0800
+++ b/sqlgrey 2011-11-30 07:57:46.000000000 -0800
@@ -43,16 +43,6 @@
my $DB_VERSION = 3;
-# Table names
-my $connect = 'connect';
-my $from_awl = 'from_awl';
-my $domain_awl = 'domain_awl';
-my $optin_domain = 'optin_domain';
-my $optin_email = 'optin_email';
-my $optout_domain = 'optout_domain';
-my $optout_email = 'optout_email';
-my $config = 'config';
-
# defaults
my %dflt;
$dflt{loglevel} = 2; # used for $dflt{log} entries in read_conffile()
@@ -76,6 +66,15 @@
$dflt{db_pass} = '';
$dflt{db_prepare_cache} = 0;
$dflt{db_cluster} = 'off';
+$dflt{db_table_temp} = 'temp';
+$dflt{db_table_connect} = 'connect';
+$dflt{db_table_from_awl} = 'from_awl';
+$dflt{db_table_domain_awl} = 'domain_awl';
+$dflt{db_table_optin_domain} = 'optin_domain';
+$dflt{db_table_optin_email} = 'optin_email';
+$dflt{db_table_optout_domain} = 'optout_domain';
+$dflt{db_table_optout_email} = 'optout_email';
+$dflt{db_table_config} = 'config';
$dflt{prepend} = 1;
$dflt{greymethod} = 'smart';
$dflt{optmethod} = 'none'; # or 'optin' or 'optout'
@@ -393,34 +392,34 @@
sub database_setup($) {
my $self = shift;
# AWL and connect tables checks
- if (! $self->table_exists($from_awl)) {
+ if (! $self->table_exists($self->{sqlgrey}{db_table_from_awl})) {
$self->create_from_awl_table();
$self->create_from_awl_indexes();
}
- if (! $self->table_exists($domain_awl)) {
+ if (! $self->table_exists($self->{sqlgrey}{db_table_domain_awl})) {
$self->create_domain_awl_table();
$self->create_domain_awl_indexes();
}
- if (! $self->table_exists($connect)) {
+ if (! $self->table_exists($self->{sqlgrey}{db_table_connect})) {
$self->create_connect_table();
$self->create_connect_indexes();
}
# optin/out tables checks
- if (! $self->table_exists($optin_domain)) {
+ if (! $self->table_exists($self->{sqlgrey}{db_table_optin_domain})) {
$self->create_optin_domain_table();
}
- if (! $self->table_exists($optin_email)) {
+ if (! $self->table_exists($self->{sqlgrey}{db_table_optin_email})) {
$self->create_optin_email_table();
}
- if (! $self->table_exists($optout_domain)) {
+ if (! $self->table_exists($self->{sqlgrey}{db_table_optout_domain})) {
$self->create_optout_domain_table();
}
- if (! $self->table_exists($optout_email)) {
+ if (! $self->table_exists($self->{sqlgrey}{db_table_optout_email})) {
$self->create_optout_email_table();
}
# config table check
- if (! $self->table_exists($config)) {
+ if (! $self->table_exists($self->{sqlgrey}{db_table_config})) {
$self->create_config_table();
$self->setconfig('version',$DB_VERSION);
}
@@ -446,10 +445,10 @@
my $self = shift;
my $param = shift;
- my $sth = $self->prepare_cached("SELECT value FROM $config " .
+ my $sth = $self->prepare_cached("SELECT value FROM $self->{sqlgrey}{db_table_config} " .
'WHERE parameter = ?');
if (!defined $sth or !$sth->execute($param)) {
- $self->mylog('dbaccess', 0, "error: couldn't access $config table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_config} table: $DBI::errstr");
return undef;
#$self->mydie('getconfig error',
# 'Can\'t continue: config table unreadable');
@@ -473,10 +472,10 @@
my $param = shift;
my $value = shift;
- my $sth = $self->prepare_cached("SELECT value FROM $config " .
+ my $sth = $self->prepare_cached("SELECT value FROM $self->{sqlgrey}{db_table_config} " .
'WHERE parameter = ?');
if (!defined $sth or !$sth->execute($param)) {
- $self->mylog('dbaccess', 0, "error: couldn't access $config table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_config} table: $DBI::errstr");
$self->mydie('setconfig error',
'Can\'t continue: config table unreadable');
}
@@ -496,7 +495,7 @@
my $old_value = shift;
- my $affected_rows = $self->do("UPDATE $config SET value = " .
+ my $affected_rows = $self->do("UPDATE $self->{sqlgrey}{db_table_config} SET value = " .
$self->quote($value) .
' WHERE parameter = ' .
$self->quote($param) .
@@ -513,7 +512,7 @@
my $param = shift;
my $value = shift;
- return $self->do("INSERT INTO $config (parameter, value) VALUES(" .
+ return $self->do("INSERT INTO $self->{sqlgrey}{db_table_config} (parameter, value) VALUES(" .
$self->quote($param) . ',' .
$self->quote($value) . ')');
}
@@ -522,7 +521,7 @@
my $self = shift;
# No config table -> version 0
- if (! $self->table_exists("$config")) {
+ if (! $self->table_exists("$self->{sqlgrey}{db_table_connect}")) {
return 0;
}
@@ -561,101 +560,101 @@
## can we detect SQLite 3+ ?
# connect
- $self->mylog('dbaccess', 2, "$connect table: renaming ip_addr to src");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_connect} table: renaming ip_addr to src");
if ($self->SQLite()) {
- $self->create_connect_table('temp');
- $self->do('INSERT INTO temp (sender_name, sender_domain, ' .
+ $self->create_connect_table($self->{sqlgrey}{db_table_temp});
+ $self->do('INSERT INTO ' . $self->{sqlgrey}{db_table_temp} . ' (sender_name, sender_domain, ' .
'src, rcpt, first_seen) ' .
'SELECT sender_name, sender_domain, ip_addr, ' .
'rcpt, first_seen ' .
- "FROM $connect");
- $self->drop_table($connect);
+ "FROM $self->{sqlgrey}{db_table_connect}");
+ $self->drop_table($self->{sqlgrey}{db_table_connect});
} else {
- $self->do("ALTER TABLE $connect RENAME TO $connect" . 'old');
+ $self->do("ALTER TABLE $self->{sqlgrey}{db_table_connect} RENAME TO $self->{sqlgrey}{db_table_connect}" . 'old');
}
$self->create_connect_table();
if ($self->SQLite()) {
- $self->do("INSERT INTO $connect (sender_name, sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_connect} (sender_name, sender_domain, " .
'src, rcpt, first_seen) ' .
'SELECT sender_name, sender_domain, src, ' .
'rcpt, first_seen ' .
- 'FROM temp');
- $self->drop_table('temp');
+ 'FROM ' . $self->{sqlgrey}{db_table_temp});
+ $self->drop_table($self->{sqlgrey}{db_table_temp});
} else {
- $self->do("INSERT INTO $connect (sender_name, sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_connect} (sender_name, sender_domain, " .
'src, rcpt, first_seen) ' .
'SELECT sender_name, sender_domain, ip_addr, ' .
'rcpt, first_seen ' .
- "FROM $connect" . 'old');
- $self->drop_table("$connect" . 'old');
+ "FROM $self->{sqlgrey}{db_table_connect}" . 'old');
+ $self->drop_table("$self->{sqlgrey}{db_table_connect}" . 'old');
}
- $self->mylog('dbaccess', 2, "$connect table: adding indexes");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_connect} table: adding indexes");
$self->create_connect_indexes();
# from_awl
- $self->mylog('dbaccess', 2, "$from_awl: renaming host_ip to src, adding first_seen");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_from_awl}: renaming host_ip to src, adding first_seen");
if ($self->SQLite()) {
- $self->create_from_awl_table('temp');
- $self->do('INSERT INTO temp (sender_name, sender_domain, ' .
+ $self->create_from_awl_table($self->{sqlgrey}{db_table_temp});
+ $self->do('INSERT INTO ' . $self->{sqlgrey}{db_table_temp} . ' (sender_name, sender_domain, ' .
'src, last_seen, first_seen) ' .
'SELECT sender_name, sender_domain, host_ip, last_seen, last_seen ' .
- "FROM $from_awl");
- $self->drop_table($from_awl);
+ "FROM $self->{sqlgrey}{db_table_from_awl}");
+ $self->drop_table($self->{sqlgrey}{db_table_from_awl});
} else {
- $self->do("ALTER TABLE $from_awl RENAME TO $from_awl" . 'old');
+ $self->do("ALTER TABLE $self->{sqlgrey}{db_table_from_awl} RENAME TO $self->{sqlgrey}{db_table_from_awl}" . 'old');
}
if ($self->PostgreSQL()) { # we need to remove the pkey constraint
- $self->do("ALTER TABLE $from_awl" . 'old DROP CONSTRAINT ' .
+ $self->do("ALTER TABLE $self->{sqlgrey}{db_table_from_awl}" . 'old DROP CONSTRAINT ' .
'from_awl_pkey');
}
$self->create_from_awl_table();
if ($self->SQLite()) {
- $self->do("INSERT INTO $from_awl (sender_name, sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_from_awl} (sender_name, sender_domain, " .
'src, last_seen, first_seen) ' .
'SELECT sender_name, sender_domain, src, last_seen, last_seen ' .
- 'FROM temp');
- $self->drop_table('temp');
+ 'FROM ' . $self->{sqlgrey}{db_table_temp});
+ $self->drop_table($self->{sqlgrey}{db_table_temp});
} else {
- $self->do("INSERT INTO $from_awl (sender_name, sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_from_awl} (sender_name, sender_domain, " .
'src, last_seen, first_seen) ' .
'SELECT sender_name, sender_domain, host_ip, last_seen, last_seen ' .
- "FROM $from_awl" . 'old');
- $self->drop_table("$from_awl" . 'old');
+ "FROM $self->{sqlgrey}{db_table_from_awl}" . 'old');
+ $self->drop_table("$self->{sqlgrey}{db_table_from_awl}" . 'old');
}
- $self->mylog('dbaccess', 2, "$from_awl: adding indexes");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_from_awl}: adding indexes");
$self->create_from_awl_indexes();
# domain_awl
- $self->mylog('dbaccess', 2, "$domain_awl: renaming host_ip to src, adding first_seen");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_domain_awl}: renaming host_ip to src, adding first_seen");
if ($self->SQLite()) {
- $self->create_domain_awl_table('temp');
- $self->do('INSERT INTO temp (sender_domain, ' .
+ $self->create_domain_awl_table($self->{sqlgrey}{db_table_temp});
+ $self->do('INSERT INTO ' . $self->{sqlgrey}{db_table_temp} . ' (sender_domain, ' .
'src, last_seen, first_seen) ' .
'SELECT sender_domain, host_ip, last_seen, last_seen ' .
- "FROM $domain_awl");
- $self->drop_table($domain_awl);
+ "FROM $self->{sqlgrey}{db_table_domain_awl}");
+ $self->drop_table($self->{sqlgrey}{db_table_domain_awl});
} else {
- $self->do("ALTER TABLE $domain_awl RENAME TO $domain_awl" . 'old');
+ $self->do("ALTER TABLE $self->{sqlgrey}{db_table_domain_awl} RENAME TO $self->{sqlgrey}{db_table_domain_awl}" . 'old');
}
if ($self->PostgreSQL()) { # we need to remove the pkey constraint
- $self->do("ALTER TABLE $domain_awl" . 'old DROP CONSTRAINT ' .
+ $self->do("ALTER TABLE $self->{sqlgrey}{db_table_domain_awl}" . 'old DROP CONSTRAINT ' .
'domain_awl_pkey');
}
$self->create_domain_awl_table();
if ($self->SQLite()) {
- $self->do("INSERT INTO $domain_awl (sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_domain_awl} (sender_domain, " .
'src, last_seen, first_seen) ' .
'SELECT sender_domain, src, last_seen, last_seen ' .
- 'FROM temp');
- $self->drop_table('temp');
+ 'FROM ' . $self->{sqlgrey}{db_table_temp});
+ $self->drop_table($self->{sqlgrey}{db_table_temp});
} else {
- $self->do("INSERT INTO $domain_awl (sender_domain, src, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_domain_awl} (sender_domain, src, " .
'last_seen, first_seen) ' .
'SELECT sender_domain, host_ip, last_seen, last_seen ' .
- "FROM $domain_awl" . 'old');
- $self->do("DROP TABLE $domain_awl" . 'old');
+ "FROM $self->{sqlgrey}{db_table_domain_awl}" . 'old');
+ $self->do("DROP TABLE $self->{sqlgrey}{db_table_domain_awl}" . 'old');
}
- $self->mylog('dbaccess', 2, "$domain_awl: adding indexes");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_domain_awl}: adding indexes");
$self->create_domain_awl_indexes();
# Update our schema
@@ -670,101 +669,101 @@
## can we detect SQLite 3+ ?
# connect
- $self->mylog('dbaccess', 2, "$connect: making room for IPv6 in src");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_connect}: making room for IPv6 in src");
if ($self->SQLite()) {
- $self->create_connect_table('temp');
- $self->do('INSERT INTO temp (sender_name, sender_domain, ' .
+ $self->create_connect_table($self->{sqlgrey}{db_table_temp});
+ $self->do('INSERT INTO ' . $self->{sqlgrey}{db_table_temp} . ' (sender_name, sender_domain, ' .
'src, rcpt, first_seen) ' .
'SELECT sender_name, sender_domain, src, ' .
'rcpt, first_seen ' .
- "FROM $connect");
- $self->drop_table($connect);
+ "FROM $self->{sqlgrey}{db_table_connect}");
+ $self->drop_table($self->{sqlgrey}{db_table_connect});
} else {
- $self->do("ALTER TABLE $connect RENAME TO $connect" . 'old');
+ $self->do("ALTER TABLE $self->{sqlgrey}{db_table_connect} RENAME TO $self->{sqlgrey}{db_table_connect}" . 'old');
}
$self->create_connect_table();
if ($self->SQLite()) {
- $self->do("INSERT INTO $connect (sender_name, sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_connect} (sender_name, sender_domain, " .
'src, rcpt, first_seen) ' .
'SELECT sender_name, sender_domain, src, ' .
'rcpt, first_seen ' .
- 'FROM temp');
- $self->drop_table('temp');
+ 'FROM ' . $self->{sqlgrey}{db_table_temp});
+ $self->drop_table($self->{sqlgrey}{db_table_temp});
} else {
- $self->do("INSERT INTO $connect (sender_name, sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_connect} (sender_name, sender_domain, " .
'src, rcpt, first_seen) ' .
'SELECT sender_name, sender_domain, src, ' .
'rcpt, first_seen ' .
- "FROM $connect" . 'old');
- $self->drop_table("$connect" . 'old');
+ "FROM $self->{sqlgrey}{db_table_connect}" . 'old');
+ $self->drop_table("$self->{sqlgrey}{db_table_connect}" . 'old');
}
- $self->mylog('dbaccess', 2, "$connect: adding indexes");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_connect}: adding indexes");
$self->create_connect_indexes();
# from_awl
- $self->mylog('dbaccess', 2, "$from_awl: making room for IPv6 in src");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_from_awl}: making room for IPv6 in src");
if ($self->SQLite()) {
- $self->create_from_awl_table('temp');
- $self->do('INSERT INTO temp (sender_name, sender_domain, ' .
+ $self->create_from_awl_table($self->{sqlgrey}{db_table_temp});
+ $self->do('INSERT INTO ' . $self->{sqlgrey}{db_table_temp} . ' (sender_name, sender_domain, ' .
'src, last_seen, first_seen) ' .
'SELECT sender_name, sender_domain, src, last_seen, last_seen ' .
- "FROM $from_awl");
- $self->drop_table($from_awl);
+ "FROM $self->{sqlgrey}{db_table_from_awl}");
+ $self->drop_table($self->{sqlgrey}{db_table_from_awl});
} else {
- $self->do("ALTER TABLE $from_awl RENAME TO $from_awl" . 'old');
+ $self->do("ALTER TABLE $self->{sqlgrey}{db_table_from_awl} RENAME TO $self->{sqlgrey}{db_table_from_awl}" . 'old');
}
if ($self->PostgreSQL()) { # we need to remove the pkey constraint
- $self->do("ALTER TABLE $from_awl" . 'old DROP CONSTRAINT ' .
+ $self->do("ALTER TABLE $self->{sqlgrey}{db_table_from_awl}" . 'old DROP CONSTRAINT ' .
'from_awl_pkey');
}
$self->create_from_awl_table();
if ($self->SQLite()) {
- $self->do("INSERT INTO $from_awl (sender_name, sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_from_awl} (sender_name, sender_domain, " .
'src, last_seen, first_seen) ' .
'SELECT sender_name, sender_domain, src, last_seen, last_seen ' .
- 'FROM temp');
- $self->drop_table('temp');
+ 'FROM ' . $self->{sqlgrey}{db_table_temp});
+ $self->drop_table($self->{sqlgrey}{db_table_temp});
} else {
- $self->do("INSERT INTO $from_awl (sender_name, sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_from_awl} (sender_name, sender_domain, " .
'src, last_seen, first_seen) ' .
'SELECT sender_name, sender_domain, src, last_seen, last_seen ' .
- "FROM $from_awl" . 'old');
- $self->drop_table($from_awl . 'old');
+ "FROM $self->{sqlgrey}{db_table_from_awl}" . 'old');
+ $self->drop_table($self->{sqlgrey}{db_table_from_awl} . 'old');
}
- $self->mylog('dbaccess', 2, "$from_awl: adding indexes");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_from_awl}: adding indexes");
$self->create_from_awl_indexes();
# domain_awl
- $self->mylog('dbaccess', 2, "$domain_awl: making room for IPv6 in src");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_domain_awl}: making room for IPv6 in src");
if ($self->SQLite()) {
- $self->create_domain_awl_table('temp');
- $self->do('INSERT INTO temp (sender_domain, ' .
+ $self->create_domain_awl_table($self->{sqlgrey}{db_table_temp});
+ $self->do('INSERT INTO ' . $self->{sqlgrey}{db_table_temp} . ' (sender_domain, ' .
'src, last_seen, first_seen) ' .
'SELECT sender_domain, src, last_seen, first_seen ' .
- "FROM $domain_awl");
- $self->drop_table($domain_awl);
+ "FROM $self->{sqlgrey}{db_table_domain_awl}");
+ $self->drop_table($self->{sqlgrey}{db_table_domain_awl});
} else {
- $self->do("ALTER TABLE $domain_awl RENAME TO $domain_awl" . 'old');
+ $self->do("ALTER TABLE $self->{sqlgrey}{db_table_domain_awl} RENAME TO $self->{sqlgrey}{db_table_domain_awl}" . 'old');
}
if ($self->PostgreSQL()) { # we need to remove the pkey constraint
- $self->do("ALTER TABLE $domain_awl" . 'old DROP CONSTRAINT ' .
+ $self->do("ALTER TABLE $self->{sqlgrey}{db_table_domain_awl}" . 'old DROP CONSTRAINT ' .
'domain_awl_pkey');
}
$self->create_domain_awl_table();
if ($self->SQLite()) {
- $self->do("INSERT INTO $domain_awl (sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_domain_awl} (sender_domain, " .
'src, last_seen, first_seen) ' .
'SELECT sender_domain, src, last_seen, first_seen ' .
- 'FROM temp');
- $self->drop_table('temp');
+ 'FROM ' . $self->{sqlgrey}{db_table_temp});
+ $self->drop_table($self->{sqlgrey}{db_table_temp});
} else {
- $self->do("INSERT INTO $domain_awl (sender_domain, src, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_domain_awl} (sender_domain, src, " .
'last_seen, first_seen) ' .
'SELECT sender_domain, src, last_seen, first_seen ' .
- "FROM $domain_awl" . 'old');
- $self->do("DROP TABLE $domain_awl" . 'old');
+ "FROM $self->{sqlgrey}{db_table_domain_awl}" . 'old');
+ $self->do("DROP TABLE $self->{sqlgrey}{db_table_domain_awl}" . 'old');
}
- $self->mylog('dbaccess', 2, "$domain_awl: adding indexes");
+ $self->mylog('dbaccess', 2, "$self->{sqlgrey}{db_table_domain_awl}: adding indexes");
$self->create_domain_awl_indexes();
# Update our schema
@@ -884,7 +883,7 @@
my $self = shift;
# allow optional table name
my $tablename = shift;
- $tablename = ! defined $tablename ? $from_awl : $tablename;
+ $tablename = ! defined $tablename ? $self->{sqlgrey}{db_table_from_awl} : $tablename;
$self->do("CREATE TABLE $tablename " .
'(sender_name varchar(64) NOT NULL, ' .
'sender_domain varchar(255) NOT NULL, ' .
@@ -898,17 +897,17 @@
}
sub create_from_awl_indexes($) {
my $self = shift;
- $self->do("CREATE INDEX $from_awl" . '_lseen ' .
- "ON $from_awl (last_seen)")
+ $self->do("CREATE INDEX $self->{sqlgrey}{db_table_from_awl}" . '_lseen ' .
+ "ON $self->{sqlgrey}{db_table_from_awl} (last_seen)")
or $self->mydie('create_from_awl_table error',
- "couldn't create index on $from_awl (last_seen)");
+ "couldn't create index on $self->{sqlgrey}{db_table_from_awl} (last_seen)");
}
sub create_domain_awl_table {
my $self = shift;
# allow optional table name
my $tablename = shift;
- $tablename = ! defined $tablename ? $domain_awl : $tablename;
+ $tablename = ! defined $tablename ? $self->{sqlgrey}{db_table_domain_awl} : $tablename;
$self->do("CREATE TABLE $tablename " .
'(sender_domain varchar(255) NOT NULL, ' .
'src varchar(39) NOT NULL, ' .
@@ -920,17 +919,17 @@
}
sub create_domain_awl_indexes($) {
my $self = shift;
- $self->do("CREATE INDEX $domain_awl" . '_lseen ' .
- "ON $domain_awl (last_seen)")
+ $self->do("CREATE INDEX $self->{sqlgrey}{db_table_domain_awl}" . '_lseen ' .
+ "ON $self->{sqlgrey}{db_table_domain_awl} (last_seen)")
or $self->mydie('create_domain_awl_table error',
- "couldn't create index on $domain_awl (last_seen)");
+ "couldn't create index on $self->{sqlgrey}{db_table_domain_awl} (last_seen)");
}
sub create_connect_table {
my $self = shift;
# allow optional table name
my $tablename = shift;
- $tablename = ! defined $tablename ? $connect : $tablename;
+ $tablename = ! defined $tablename ? $self->{sqlgrey}{db_table_connect} : $tablename;
# Note: no primary key, Mysql can't handle 500+ byte primary keys
# connect should not become big enough to make it a problem
$self->do("CREATE TABLE $tablename " .
@@ -944,62 +943,62 @@
}
sub create_connect_indexes($) {
my $self = shift;
- $self->do("CREATE INDEX $connect" . '_idx ' .
- "ON $connect (src, sender_domain, sender_name)")
+ $self->do("CREATE INDEX $self->{sqlgrey}{db_table_connect}" . '_idx ' .
+ "ON $self->{sqlgrey}{db_table_connect} (src, sender_domain, sender_name)")
or $self->mydie('create_connect_table error',
- "couldn't create index on $connect (src, sender_domain, sender_name)");
- $self->do("CREATE INDEX $connect" . '_fseen ' .
- "ON $connect (first_seen)")
+ "couldn't create index on $self->{sqlgrey}{db_table_connect} (src, sender_domain, sender_name)");
+ $self->do("CREATE INDEX $self->{sqlgrey}{db_table_connect}" . '_fseen ' .
+ "ON $self->{sqlgrey}{db_table_connect} (first_seen)")
or $self->mydie('create_connect_table error',
- "couldn't create index on $connect (first_seen)");
+ "couldn't create index on $self->{sqlgrey}{db_table_connect} (first_seen)");
}
sub create_config_table($) {
my $self = shift;
- $self->do("CREATE TABLE $config " .
+ $self->do("CREATE TABLE $self->{sqlgrey}{db_table_config} " .
'(parameter varchar(255) NOT NULL, ' .
'value varchar(255), ' .
'PRIMARY KEY (parameter));')
or $self->mydie('create_config_table',
- "Couldn't create table $config: $DBI::errstr");
+ "Couldn't create table $self->{sqlgrey}{db_table_config}: $DBI::errstr");
# we just created the table: this is the current version
$self->setconfig('version', $DB_VERSION);
}
sub create_optin_domain_table($) {
my $self = shift;
- $self->do("CREATE TABLE $optin_domain " .
+ $self->do("CREATE TABLE $self->{sqlgrey}{db_table_optin_domain} " .
'(domain varchar(255) NOT NULL, ' .
'PRIMARY KEY (domain));')
or $self->mydie('create_optin_domain_table',
- "Couldn't create table $optin_domain: $DBI::errstr");
+ "Couldn't create table $self->{sqlgrey}{db_table_optin_domain}: $DBI::errstr");
}
sub create_optin_email_table($) {
my $self = shift;
- $self->do("CREATE TABLE $optin_email " .
+ $self->do("CREATE TABLE $self->{sqlgrey}{db_table_optin_email} " .
'(email varchar(255) NOT NULL, ' .
'PRIMARY KEY (email));')
or $self->mydie('create_optin_email_table',
- "Couldn't create table $optin_email: $DBI::errstr");
+ "Couldn't create table $self->{sqlgrey}{db_table_optin_email}: $DBI::errstr");
}
sub create_optout_domain_table($) {
my $self = shift;
- $self->do("CREATE TABLE $optout_domain " .
+ $self->do("CREATE TABLE $self->{sqlgrey}{db_table_optout_domain} " .
'(domain varchar(255) NOT NULL, ' .
'PRIMARY KEY (domain));')
or $self->mydie('create_optout_domain_table',
- "Couldn't create table $optout_domain: $DBI::errstr");
+ "Couldn't create table $self->{sqlgrey}{db_table_optout_domain}: $DBI::errstr");
}
sub create_optout_email_table {
my $self = shift;
- $self->do("CREATE TABLE $optout_email " .
+ $self->do("CREATE TABLE $self->{sqlgrey}{db_table_optout_email} " .
'(email varchar(255) NOT NULL, ' .
'PRIMARY KEY (email));')
or $self->mydie('create_optout_email_table',
- "Couldn't create table $optout_email: $DBI::errstr");
+ "Couldn't create table $self->{sqlgrey}{db_table_optout_email}: $DBI::errstr");
}
##########
@@ -1217,7 +1216,7 @@
my ($self, $sender_name, $sender_domain, $host) = @_;
# last_seen less than $self->{sqlgrey}{awl_age} days ago
- my $sth = $self->prepare("SELECT 1 FROM $from_awl " .
+ my $sth = $self->prepare("SELECT 1 FROM $self->{sqlgrey}{db_table_from_awl} " .
'WHERE sender_name = ? ' .
'AND sender_domain = ? ' .
'AND src = ? ' .
@@ -1227,7 +1226,7 @@
);
if (!defined $sth or !$sth->execute($sender_name, $sender_domain, $host)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $from_awl table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_from_awl} table: $DBI::errstr");
return 1; # in doubt, accept
} else {
$self->db_available();
@@ -1244,7 +1243,7 @@
my ($self, $sender_domain, $host) = @_;
# last_seen less than $self->{sqlgrey}{awl_age} days ago
- my $sth = $self->prepare("SELECT 1 FROM $domain_awl " .
+ my $sth = $self->prepare("SELECT 1 FROM $self->{sqlgrey}{db_table_domain_awl} " .
'WHERE sender_domain = ? ' .
'AND src = ? ' .
'AND last_seen > ' .
@@ -1253,7 +1252,7 @@
);
if (!defined $sth or !$sth->execute($sender_domain, $host)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $domain_awl table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_domain_awl} table: $DBI::errstr");
return 1; # in doubt, accept
} else {
$self->db_available();
@@ -1272,13 +1271,13 @@
my ($self, $sender_name, $sender_domain, $host, $first_seen) = @_;
# delete old entries
- $self->do("DELETE FROM $from_awl " .
+ $self->do("DELETE FROM $self->{sqlgrey}{db_table_from_awl} " .
'WHERE sender_name = ' . $self->quote($sender_name) .
' AND sender_domain = ' . $self->quote($sender_domain) .
' AND src = ' . $self->quote($host));
# create new entry
- $self->do("INSERT INTO $from_awl (sender_name, sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_from_awl} (sender_name, sender_domain, " .
'src, first_seen, last_seen) VALUES(' .
$self->quote($sender_name) . ',' .
$self->quote($sender_domain) . ',' .
@@ -1290,12 +1289,12 @@
my ($self, $sender_domain, $host, $first_seen) = @_;
# delete old entries
- $self->do("DELETE FROM $domain_awl " .
+ $self->do("DELETE FROM $self->{sqlgrey}{db_table_domain_awl} " .
'WHERE sender_domain = ' . $self->quote($sender_domain) .
' AND src = ' . $self->quote($host));
# create new entry
- $self->do("INSERT INTO $domain_awl (sender_domain, src, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_domain_awl} (sender_domain, src, " .
'first_seen, last_seen) VALUES(' .
$self->quote($sender_domain) . ',' .
$self->quote($host) . ',' .
@@ -1307,7 +1306,7 @@
sub update_from_awl($$$$) {
my ($self, $sender_name, $sender_domain, $host) = @_;
- $self->do("UPDATE $from_awl " .
+ $self->do("UPDATE $self->{sqlgrey}{db_table_from_awl} " .
'SET last_seen = NOW(), first_seen = first_seen ' .
'WHERE sender_name = ' . $self->quote($sender_name) .
' AND sender_domain = ' . $self->quote($sender_domain) .
@@ -1317,7 +1316,7 @@
sub update_domain_awl($$$) {
my ($self, $sender_domain, $host) = @_;
- $self->do("UPDATE $domain_awl " .
+ $self->do("UPDATE $self->{sqlgrey}{db_table_domain_awl} " .
'SET last_seen = NOW(), first_seen = first_seen ' .
'WHERE sender_domain = ' . $self->quote($sender_domain) .
' AND src = ' . $self->quote($host));
@@ -1327,11 +1326,11 @@
sub count_from_awl($$$) {
my ($self, $sender_domain, $host) = @_;
- my $sth = $self->prepare_cached("SELECT COUNT(*) FROM $from_awl " .
+ my $sth = $self->prepare_cached("SELECT COUNT(*) FROM $self->{sqlgrey}{db_table_from_awl} " .
'WHERE sender_domain = ? AND src = ?');
if (!defined $sth or !$sth->execute($sender_domain, $host)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $from_awl table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_from_awl} table: $DBI::errstr");
return 0; # do as if table is empty
} else {
$self->db_available();
@@ -1350,11 +1349,11 @@
sub count_src_domain_awl($$) {
my ($self, $host) = @_;
- my $sth = $self->prepare_cached("SELECT COUNT(*) FROM $domain_awl " .
+ my $sth = $self->prepare_cached("SELECT COUNT(*) FROM $self->{sqlgrey}{db_table_domain_awl} " .
'WHERE src = ?');
if (!defined $sth or !$sth->execute($host)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $domain_awl table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_domain_awl} table: $DBI::errstr");
return 0; # do as if table is empty
} else {
$self->db_available();
@@ -1373,11 +1372,11 @@
sub count_src_from_awl($$) {
my ($self, $host) = @_;
- my $sth = $self->prepare_cached("SELECT COUNT(*) FROM $from_awl " .
+ my $sth = $self->prepare_cached("SELECT COUNT(*) FROM $self->{sqlgrey}{db_table_from_awl} " .
'WHERE src = ?');
if (!defined $sth or !$sth->execute($host)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $from_awl table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_from_awl} table: $DBI::errstr");
return 0; # do as if table is empty
} else {
$self->db_available();
@@ -1396,11 +1395,11 @@
sub count_src_connect($$) {
my ($self, $host) = @_;
- my $sth = $self->prepare_cached("SELECT COUNT(*) FROM $connect " .
+ my $sth = $self->prepare_cached("SELECT COUNT(*) FROM $self->{sqlgrey}{db_table_connect} " .
'WHERE src = ?');
if (!defined $sth or !$sth->execute($host)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $connect table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_connect} table: $DBI::errstr");
return 0; # do as if table is empty
} else {
$self->db_available();
@@ -1420,7 +1419,7 @@
sub cleanup_from_awl($) {
my ($self) = @_;
- my $rows = $self->do("DELETE FROM $from_awl " .
+ my $rows = $self->do("DELETE FROM $self->{sqlgrey}{db_table_from_awl} " .
'WHERE last_seen < ' .
$self->past_tstamp($self->{sqlgrey}{awl_age}, 'DAY')
);
@@ -1432,7 +1431,7 @@
sub cleanup_domain_awl($) {
my ($self) = @_;
- my $rows = $self->do("DELETE FROM $domain_awl " .
+ my $rows = $self->do("DELETE FROM $self->{sqlgrey}{db_table_domain_awl} " .
'WHERE last_seen < ' .
$self->past_tstamp($self->{sqlgrey}{awl_age}, 'DAY')
);
@@ -1443,14 +1442,14 @@
sub delete_domain_from_mail_awl($$$) {
my ($self, $domain, $host) = @_;
- $self->do("DELETE FROM $from_awl " .
+ $self->do("DELETE FROM $self->{sqlgrey}{db_table_from_awl} " .
'WHERE sender_domain = ' . $self->quote($domain) .
' AND src = ' . $self->quote($host));
}
sub delete_domain_from_connect($$$) {
my ($self, $domain, $host) = @_;
- $self->do("DELETE FROM $connect " .
+ $self->do("DELETE FROM $self->{sqlgrey}{db_table_connect} " .
'WHERE sender_domain = ' . $self->quote($domain) .
' AND src = ' . $self->quote($host));
}
@@ -1466,12 +1465,12 @@
sub get_first_seen_in_from_awl($$$) {
my ($self, $domain, $host) = @_;
- my $sth = $self->prepare_cached("SELECT MIN(first_seen) FROM $from_awl " .
+ my $sth = $self->prepare_cached("SELECT MIN(first_seen) FROM $self->{sqlgrey}{db_table_from_awl} " .
'WHERE sender_domain = ? AND src = ?');
if (!defined $sth or !$sth->execute($domain, $host)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $from_awl table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_from_awl} table: $DBI::errstr");
return 0; # do as if table is empty
} else {
$self->db_available();
@@ -1495,7 +1494,7 @@
# last_seen less than $self->{sqlgrey}{max_connect_age} hours ago
# but more than $self->{sqlgrey}{reconnect_delay} minutes ago
- my $sth = $self->prepare("SELECT 1 FROM $connect " .
+ my $sth = $self->prepare("SELECT 1 FROM $self->{sqlgrey}{db_table_connect} " .
'WHERE sender_name = ? AND sender_domain = ? ' .
'AND src = ? AND rcpt = ? ' .
'AND first_seen BETWEEN ' .
@@ -1507,7 +1506,7 @@
);
if (!defined $sth or !$sth->execute($sender_name, $sender_domain, $addr, $rcpt)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $connect table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_connect} table: $DBI::errstr");
return 1; # in doubt, accept
} else {
$self->db_available();
@@ -1525,7 +1524,7 @@
my ($self, $sender_name, $sender_domain, $addr, $rcpt) = @_;
# last_seen less than $self->{sqlgrey}{reconnect_delay} minutes ago
- my $sth = $self->prepare("SELECT 1 FROM $connect WHERE sender_name = ? " .
+ my $sth = $self->prepare("SELECT 1 FROM $self->{sqlgrey}{db_table_connect} WHERE sender_name = ? " .
'AND sender_domain = ? ' .
'AND src = ? AND rcpt = ? ' .
'AND first_seen >= ' .
@@ -1534,7 +1533,7 @@
);
if (!defined $sth or !$sth->execute($sender_name, $sender_domain, $addr, $rcpt)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: Couldn't access $connect table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: Couldn't access $self->{sqlgrey}{db_table_connect} table: $DBI::errstr");
return 0; # in doubt, accept
} else {
$self->db_available();
@@ -1552,7 +1551,7 @@
my ($self, $sender_name, $sender_domain, $addr, $rcpt) = @_;
# create new entry
- $self->do("INSERT INTO $connect (sender_name, sender_domain, " .
+ $self->do("INSERT INTO $self->{sqlgrey}{db_table_connect} (sender_name, sender_domain, " .
'src, rcpt, first_seen) ' .
'VALUES(' .
$self->quote($sender_name) . ',' .
@@ -1569,9 +1568,9 @@
if ($self->MySQL()) {
$query = 'SELECT first_seen, SEC_TO_TIME(UNIX_TIMESTAMP(NOW())-' .
'UNIX_TIMESTAMP(first_seen)) ' .
- "FROM $connect ";
+ "FROM $self->{sqlgrey}{db_table_connect} ";
} else {
- $query = "SELECT first_seen, now() - first_seen FROM $connect ";
+ $query = "SELECT first_seen, now() - first_seen FROM $self->{sqlgrey}{db_table_connect} ";
}
$query .= 'WHERE sender_name = ? AND sender_domain = ? ' .
'AND src = ? AND rcpt = ?';
@@ -1600,7 +1599,7 @@
$deverp_sender_name =~ s/#/%/g;
- $self->do("DELETE FROM $connect " .
+ $self->do("DELETE FROM $self->{sqlgrey}{db_table_connect} " .
'WHERE src = ' . $self->quote($addr) .
' AND sender_domain = ' . $self->quote($sender_domain) .
' AND sender_name LIKE ' . $self->quote($deverp_sender_name) );
@@ -1615,7 +1614,7 @@
# Print probable SPAM:
my $sth = $self->prepare('SELECT sender_name, sender_domain, src, ' .
'rcpt, first_seen ' .
- "FROM $connect " .
+ "FROM $self->{sqlgrey}{db_table_connect} " .
'WHERE first_seen < ' .
$tstamp);
if (defined $sth and $sth->execute()) {
@@ -1632,7 +1631,7 @@
"error: couldn't list detected spam attempts: $DBI::errstr");
}
}
- my $rows = $self->do("DELETE FROM $connect " .
+ my $rows = $self->do("DELETE FROM $self->{sqlgrey}{db_table_connect} " .
'WHERE first_seen < ' .
$tstamp
);
@@ -2011,21 +2010,21 @@
sub is_in_optin_domain($$) {
my ($self, $domain) = @_;
- my $sth = $self->prepare_cached("SELECT 1 FROM $optin_domain " .
+ my $sth = $self->prepare_cached("SELECT 1 FROM $self->{sqlgrey}{db_table_optin_domain} " .
'WHERE domain = ?');
if (!defined $sth or !$sth->execute($domain)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $optin_domain table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_optin_domain} table: $DBI::errstr");
return 0; # in doubt, no greylisting
} else {
$self->db_available();
}
my $result = $sth->fetchall_arrayref();
if ($#$result != 0) {
- $self->mylog('optin', 4, "$domain not in $optin_domain");
+ $self->mylog('optin', 4, "$domain not in $self->{sqlgrey}{db_table_optin_domain}");
return 0; # not a single entry
} else {
- $self->mylog('optin', 4, "$domain in $optin_domain");
+ $self->mylog('optin', 4, "$domain in $self->{sqlgrey}{db_table_optin_domain}");
return 1; # one single entry (no multiple entries by design)
}
}
@@ -2033,21 +2032,21 @@
sub is_in_optin_email($$) {
my ($self, $email) = @_;
- my $sth = $self->prepare_cached("SELECT 1 FROM $optin_email " .
+ my $sth = $self->prepare_cached("SELECT 1 FROM $self->{sqlgrey}{db_table_optin_email} " .
'WHERE email = ?');
if (!defined $sth or !$sth->execute($email)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $optin_email table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_optin_email} table: $DBI::errstr");
return 0; # in doubt, no greylisting
} else {
$self->db_available();
}
my $result = $sth->fetchall_arrayref();
if ($#$result != 0) {
- $self->mylog('optin', 4, "$email not in $optin_email");
+ $self->mylog('optin', 4, "$email not in $self->{sqlgrey}{db_table_optin_email}");
return 0; # not a single entry
} else {
- $self->mylog('optin', 4, "$email in $optin_email");
+ $self->mylog('optin', 4, "$email in $self->{sqlgrey}{db_table_optin_email}");
return 1; # one single entry (no multiple entries by design)
}
}
@@ -2055,21 +2054,21 @@
sub is_in_optout_domain($$) {
my ($self, $domain) = @_;
- my $sth = $self->prepare_cached("SELECT 1 FROM $optout_domain " .
+ my $sth = $self->prepare_cached("SELECT 1 FROM $self->{sqlgrey}{db_table_optout_domain} " .
'WHERE domain = ?');
if (!defined $sth or !$sth->execute($domain)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $optout_domain table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_optout_domain} table: $DBI::errstr");
return 1; # in doubt, no greylisting
} else {
$self->db_available();
}
my $result = $sth->fetchall_arrayref();
if ($#$result != 0) {
- $self->mylog('optin', 4, "$domain not in $optout_domain");
+ $self->mylog('optin', 4, "$domain not in $self->{sqlgrey}{db_table_optout_domain}");
return 0; # not a single entry
} else {
- $self->mylog('optin', 4, "$domain in $optout_domain");
+ $self->mylog('optin', 4, "$domain in $self->{sqlgrey}{db_table_optout_domain}");
return 1; # one single entry (no multiple entries by design)
}
}
@@ -2077,21 +2076,21 @@
sub is_in_optout_email($$) {
my ($self, $email) = @_;
- my $sth = $self->prepare_cached("SELECT 1 FROM $optout_email " .
+ my $sth = $self->prepare_cached("SELECT 1 FROM $self->{sqlgrey}{db_table_optout_email} " .
'WHERE email = ?');
if (!defined $sth or !$sth->execute($email)) {
$self->db_unavailable();
- $self->mylog('dbaccess', 0, "error: couldn't access $optin_email table: $DBI::errstr");
+ $self->mylog('dbaccess', 0, "error: couldn't access $self->{sqlgrey}{db_table_optin_email} table: $DBI::errstr");
return 1; # in doubt, no greylisting
} else {
$self->db_available();
}
my $result = $sth->fetchall_arrayref();
if ($#$result != 0) {
- $self->mylog('optin', 4, "$email not in $optout_email");
+ $self->mylog('optin', 4, "$email not in $self->{sqlgrey}{db_table_optout_email}");
return 0; # not a single entry
} else {
- $self->mylog('optin', 4, "$email in $optout_email");
+ $self->mylog('optin', 4, "$email in $self->{sqlgrey}{db_table_optout_email}");
return 1; # one single entry (no multiple entries by design)
}
}
@@ -2642,6 +2641,15 @@
db_user => $dflt{db_user},
db_pass => $dflt{db_pass},
db_available => 1, # used to trigger e-mails
+ db_table_temp => $dflt{db_table_temp},
+ db_table_connect => $dflt{db_table_connect},
+ db_table_from_awl => $dflt{db_table_from_awl},
+ db_table_domain_awl => $dflt{db_table_domain_awl},
+ db_table_optin_domain => $dflt{db_table_optin_domain},
+ db_table_optin_email => $dflt{db_table_optin_email},
+ db_table_optout_domain => $dflt{db_table_optout_domain},
+ db_table_optout_email => $dflt{db_table_optout_email},
+ db_table_config => $dflt{db_table_config},
clean_method => $dflt{clean_method},
prepend => $dflt{prepend},
greymethod => $dflt{greymethod},