summaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
authorAndreas Unterkircher <unki@netshadow.at>2008-12-12 18:34:52 +0100
committerAndreas Unterkircher <unki@netshadow.at>2008-12-12 18:34:52 +0100
commit226ad0a3c764c0606048acf7371b02765eee60d2 (patch)
tree1a9db74a103714ea5bac7ccf644eb44594a0b9e3 /doc
downloadexilog-226ad0a3c764c0606048acf7371b02765eee60d2.zip
exilog-226ad0a3c764c0606048acf7371b02765eee60d2.tar.gz
exilog-226ad0a3c764c0606048acf7371b02765eee60d2.tar.bz2
Imported Upstream version 0.5upstream/0.5
Diffstat (limited to 'doc')
-rw-r--r--doc/Changelog31
-rw-r--r--doc/exilog.txt171
-rw-r--r--doc/mysql-db-script.sql199
-rw-r--r--doc/pgsql-db-script.sql624
4 files changed, 1025 insertions, 0 deletions
diff --git a/doc/Changelog b/doc/Changelog
new file mode 100644
index 0000000..f3d3c11
--- /dev/null
+++ b/doc/Changelog
@@ -0,0 +1,31 @@
+0.5 - Feature: Add support for basic user access
+ levels.
+ - Feature: Add support to deliver,cancel and
+ delete queued messages.
+ - Make "pretty process names" for the agent
+ configurable (Thanks to Sven Hartge).
+
+0.4 - Fix network matching code
+ - Add pidfile support for the agent.
+ (Thanks to Sven Hartge)
+ - Add support for "log_timezone = true"
+ (Thanks to Jeremy Harris)
+
+0.3 - Fix detection of post-DATA rejects
+ (Thanks to Chris Lear)
+ - Fix quoting of "completed" timestamp
+ in exilog_sql.pm.
+ - Fix delivery parsing when +sender_on_delivery
+ is set.
+ - Docs: mention exilog_cleanup.pl.
+ - Docs: mention possibility to run the
+ agent non-root.
+
+0.2 - Use FindBin to find out binary location
+ - Fix bug in SQL quoting.
+ - Remove link from "Server" to the unfinished
+ Queue display :)
+ - Docs: Mention Net::Netmask prerequisite.
+ - Docs: Add small usage section.
+
+0.01 Initial Release
diff --git a/doc/exilog.txt b/doc/exilog.txt
new file mode 100644
index 0000000..da0bcd2
--- /dev/null
+++ b/doc/exilog.txt
@@ -0,0 +1,171 @@
+Exilog - Central logging and reporting tool for Exim
+----------------------------------------------------
+Author: Tom Kistner <tom@duncanthrax.net>
+
+
+Introduction
+------------
+Exilog is a tool to centralize and visualize Exim logs
+across multiple Exim servers. It is used in addition to
+Exim's standard or syslog logging. It does not require
+changing Exim or its logging style (In fact you don't
+even need to restart your Exim(s) to install Exilog).
+
+Exilog is SQL-based and requires
+
+- A SQL Server (mysql and postgres are supported)
+- An HTTP Server with CGI support (Apache comes to mind)
+- Perl with
+ o DBD/DBI SQL Database modules for the selected database.
+ o Net::Netmask module
+ You can get these modules via CPAN, but there is a good
+ chance that your OS distribution has precompiled packages
+ available.
+- A modern browser (recent Mozilla, Firefox, IE5/6, Safari)
+
+
+Target Audience
+---------------
+Postmasters who want to be able to troubleshoot email
+delivery across their Exim installations, no matter if
+used as relays or backend IMAP and POP toasters.
+
+Postmasters who want to offload support grungework to
+staff who is less proficient with grep, sed and awk.
+
+
+Features
+--------
+Search for addresses, hosts (names and IP addresses),
+messages IDs and ident strings.
+
+Filter by event types: Arrivals, Deliveries, Deferrals,
+Errors, Rejects and messages that are still on-queue.
+
+Message actions: Force delivery, cancel and delete.
+
+Filter by time range, servers and server groups.
+
+See basic host statistics, message sizes, message transfer
+times.
+
+Point-and-click on message IDs, IP addresses, hostnames to
+get different filtering results.
+
+Track messages across servers by header message ID.
+
+
+Installation
+------------
+An Exilog installation consist of four parts:
+
+1) The database holding the log information.
+2) The web interface.
+3) The agents on the Exim servers.
+4) Database cleanup (via Cron)
+
+These parts can reside on different machines, or all be
+on the same machine. For best results, the database and
+web interface should be on the same physical box, however.
+
+1) Installing the database.
+
+ Select if you want to use MySQL or Postgres. MySQL is
+ somehow preferred since its default case insensitivy
+ is better suited for the job.
+
+ Create a database using the respective SQL scripts from
+ /doc. For postgres, you might have to slightly edit the
+ script to change the 'exilog' user name (or create the
+ 'exilog' user first).
+
+ If necessary, create a database user that has
+ full rights on the new database.
+
+ Make sure the database is reachable by TCP/IP from each
+ of your Exim servers.
+
+
+2) Installing the Web Interface.
+
+ Untar the exilog distribution somewhere where your HTTP
+ server can reach it (/var/www/localhost/htdocs/exilog ...
+ you get the idea).
+
+ Rename the exilog.conf-example file to exilog.conf and
+ edit it. It is fully commented. Then return to this document.
+
+ exilog_cgi.pl is the web interface. Set it up as
+ DirectoryIndex if you like.
+
+ Optionally, set up access controls. You should also deny
+ read access to exilog.conf from HTTP clients.
+
+ Open your browser and open exilog_cgi.pl. If you see
+ the "Messages" tab you are fine.
+
+ If you want to restrict access to the web interface, set
+ up basic authentication (possibly via .htaccess/.htpasswd).
+
+ Now we need to feed some data into the database.
+
+
+3) Installing the Exim server agent(s).
+
+ You'll need to deploy one Exilog agent on each exim server
+ you run.
+
+ For each server, untar the Exilog distribution somewhere,
+ overwrite the vanilla exilog.conf with the one you edited
+ in step 2, then open it and tweak the "agent" section to
+ match the server you are installing it on. Also tweak the
+ SQL section to include host and port definitions of your SQL
+ server so the agent knows where to connect to.
+
+ Then run exilog_agent.pl as root. You might want to include
+ a start/stop procedure for the agent in your Exim rc file.
+
+ You can also run the agent as a non-root user if that UID
+ * Can read Exim's logs.
+ * Write the configured agent log file.
+ * Is a trusted user in Exim.
+ Of course root can do all that without further configuration
+ tweaks. Using Exim's own effective UID is also possible.
+
+ Sending SIGTERM to the agent parent process will make it
+ cleanly quit, including all of its children.
+
+ When the agent is started, it will pump the current log file
+ into the database (this can take a while), then tail it. It
+ will automatically detect log rotation and re-open the file
+ if necessary.
+
+
+4) Setting up the database cleanup script
+
+ Set up exilog_cleanup.pl to run daily via cron. This will
+ typically reside on the database or web host. Remember to
+ set the "cleanup->cutoff" parameter in exilog.conf to the
+ number of days worth of data you want to keep in the database.
+
+
+
+Usage
+-----
+That should be pretty straightforward. One detail is important:
+
+When searching for addresses and hostnames, you must use SQL
+wildcards when only specifying a substring:
+
+% Matches any string of zero or more characters.
+_ Matches any one character.
+
+Example: You want to find all mails with addresses that contain
+'joe', so you'd search for '%joe%'.
+
+
+--
+Tom Kistner
+<tom@duncanthrax.net>
+June 2005
+
diff --git a/doc/mysql-db-script.sql b/doc/mysql-db-script.sql
new file mode 100644
index 0000000..7ed82a6
--- /dev/null
+++ b/doc/mysql-db-script.sql
@@ -0,0 +1,199 @@
+# phpMyAdmin MySQL-Dump
+# version 2.3.2
+# http://www.phpmyadmin.net/ (download page)
+#
+# Host: localhost
+# Erstellungszeit: 02. Juni 2005 um 15:40
+# Server Version: 3.23.47
+# PHP-Version: 4.1.2
+# Datenbank: `exilog`
+# --------------------------------------------------------
+
+#
+# Tabellenstruktur für Tabelle `deferrals`
+#
+
+CREATE TABLE `deferrals` (
+ `server` varchar(32) NOT NULL default '',
+ `message_id` varchar(16) binary NOT NULL default '',
+ `timestamp` bigint(20) NOT NULL default '0',
+ `rcpt` varchar(200) NOT NULL default '',
+ `rcpt_intermediate` varchar(200) default NULL,
+ `rcpt_final` varchar(200) NOT NULL default '',
+ `host_addr` varchar(15) default NULL,
+ `host_dns` varchar(255) default NULL,
+ `tls_cipher` varchar(128) default NULL,
+ `router` varchar(128) default NULL,
+ `transport` varchar(128) default NULL,
+ `shadow_transport` varchar(128) default NULL,
+ `errmsg` blob,
+ PRIMARY KEY (`server`,`message_id`,`timestamp`,`rcpt`,`rcpt_final`),
+ KEY `rcpt` (`rcpt`),
+ KEY `rcpt_final` (`rcpt_final`),
+ KEY `server` (`server`),
+ KEY `message_id` (`message_id`),
+ KEY `timestamp` (`timestamp`),
+ KEY `host_addr` (`host_addr`)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Tabellenstruktur für Tabelle `deliveries`
+#
+
+CREATE TABLE `deliveries` (
+ `server` varchar(32) NOT NULL default '',
+ `message_id` varchar(16) binary NOT NULL default '',
+ `timestamp` bigint(20) NOT NULL default '0',
+ `rcpt` varchar(200) NOT NULL default '',
+ `rcpt_intermediate` varchar(200) default NULL,
+ `rcpt_final` varchar(200) NOT NULL default '',
+ `host_addr` varchar(15) default NULL,
+ `host_dns` varchar(255) default NULL,
+ `tls_cipher` varchar(128) default NULL,
+ `router` varchar(128) default NULL,
+ `transport` varchar(128) default NULL,
+ `shadow_transport` varchar(128) default NULL,
+ PRIMARY KEY (`server`,`message_id`,`timestamp`,`rcpt`,`rcpt_final`),
+ KEY `rcpt` (`rcpt`),
+ KEY `rcpt_final` (`rcpt_final`),
+ KEY `host_dns` (`host_dns`),
+ KEY `timestamp` (`timestamp`),
+ KEY `server` (`server`),
+ KEY `message_id` (`message_id`),
+ KEY `host_addr` (`host_addr`)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Tabellenstruktur für Tabelle `errors`
+#
+
+CREATE TABLE `errors` (
+ `server` varchar(32) NOT NULL default '',
+ `message_id` varchar(16) binary NOT NULL default '',
+ `timestamp` bigint(20) NOT NULL default '0',
+ `rcpt` varchar(200) NOT NULL default '',
+ `rcpt_intermediate` varchar(200) default NULL,
+ `rcpt_final` varchar(200) NOT NULL default '',
+ `host_addr` varchar(15) default NULL,
+ `host_dns` varchar(255) default NULL,
+ `tls_cipher` varchar(128) default NULL,
+ `router` varchar(128) default NULL,
+ `transport` varchar(128) default NULL,
+ `shadow_transport` varchar(128) default NULL,
+ `errmsg` blob,
+ PRIMARY KEY (`server`,`message_id`,`timestamp`,`rcpt`,`rcpt_final`),
+ KEY `timestamp` (`timestamp`),
+ KEY `server` (`server`),
+ KEY `rcpt` (`rcpt`),
+ KEY `host_addr` (`host_addr`),
+ KEY `message_id` (`message_id`),
+ KEY `rcpt_final` (`rcpt_final`)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Tabellenstruktur für Tabelle `messages`
+#
+
+CREATE TABLE `messages` (
+ `server` varchar(32) NOT NULL default '',
+ `message_id` varchar(16) binary NOT NULL default '',
+ `timestamp` bigint(20) default NULL,
+ `msgid` varchar(255) default NULL,
+ `completed` bigint(20) default NULL,
+ `mailfrom` varchar(255) default NULL,
+ `host_addr` varchar(15) default NULL,
+ `host_rdns` varchar(255) default NULL,
+ `host_ident` varchar(255) default NULL,
+ `host_helo` varchar(255) default NULL,
+ `proto` varchar(32) default NULL,
+ `size` bigint(20) default NULL,
+ `tls_cipher` varchar(128) default NULL,
+ `user` varchar(128) default NULL,
+ `bounce_parent` varchar(16) default NULL,
+ PRIMARY KEY (`server`,`message_id`),
+ KEY `msgid` (`msgid`),
+ KEY `user` (`user`),
+ KEY `timestamp` (`timestamp`),
+ KEY `host_addr` (`host_addr`),
+ KEY `message_id` (`message_id`),
+ KEY `bounce_parent` (`bounce_parent`),
+ KEY `mailfrom` (`mailfrom`),
+ KEY `server` (`server`),
+ KEY `host_dns` (`host_rdns`)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Tabellenstruktur für Tabelle `queue`
+#
+
+CREATE TABLE `queue` (
+ `server` varchar(32) NOT NULL default '',
+ `message_id` varchar(16) binary NOT NULL default '',
+ `mailfrom` varchar(255) NOT NULL default '',
+ `timestamp` bigint(20) NOT NULL default '0',
+ `num_dsn` int(11) NOT NULL default '0',
+ `frozen` bigint(20) default NULL,
+ `recipients_delivered` blob,
+ `recipients_pending` blob,
+ `spool_path` varchar(64) NOT NULL default '',
+ `subject` varchar(255) default NULL,
+ `msgid` varchar(255) default NULL,
+ `headers` blob NOT NULL,
+ `action` varchar(64) default NULL,
+ PRIMARY KEY (`server`,`message_id`),
+ KEY `spool_path` (`spool_path`),
+ KEY `mailfrom` (`mailfrom`),
+ KEY `message_id` (`message_id`),
+ KEY `server` (`server`),
+ KEY `timestamp` (`timestamp`),
+ KEY `frozen` (`frozen`),
+ KEY `msgid` (`msgid`),
+ KEY `action` (`action`)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Tabellenstruktur für Tabelle `rejects`
+#
+
+CREATE TABLE `rejects` (
+ `server` varchar(32) NOT NULL default '',
+ `message_id` varchar(16) binary default NULL,
+ `timestamp` bigint(20) NOT NULL default '0',
+ `host_addr` varchar(15) NOT NULL default '',
+ `host_rdns` varchar(255) NOT NULL default '',
+ `host_ident` varchar(255) default NULL,
+ `host_helo` varchar(255) default NULL,
+ `mailfrom` varchar(255) default NULL,
+ `rcpt` varchar(255) default NULL,
+ `errmsg` varchar(255) NOT NULL default '',
+ UNIQUE KEY `rejects_unique` (`server`,`timestamp`,`host_addr`,`errmsg`),
+ KEY `message_id` (`message_id`),
+ KEY `server` (`server`),
+ KEY `timestamp` (`timestamp`),
+ KEY `host_addr` (`host_addr`),
+ KEY `mailfrom` (`mailfrom`),
+ KEY `rcpt` (`rcpt`),
+ KEY `host_dns` (`host_rdns`)
+) TYPE=MyISAM;
+# --------------------------------------------------------
+
+#
+# Tabellenstruktur für Tabelle `unknown`
+#
+
+CREATE TABLE `unknown` (
+ `server` varchar(32) NOT NULL default '',
+ `message_id` varchar(16) binary NOT NULL default '',
+ `timestamp` bigint(20) NOT NULL default '0',
+ `line` varchar(255) NOT NULL default '',
+ PRIMARY KEY (`server`,`message_id`,`timestamp`,`line`),
+ KEY `server` (`server`),
+ KEY `message_id` (`message_id`),
+ KEY `timestamp` (`timestamp`)
+) TYPE=MyISAM;
+
diff --git a/doc/pgsql-db-script.sql b/doc/pgsql-db-script.sql
new file mode 100644
index 0000000..425f2b4
--- /dev/null
+++ b/doc/pgsql-db-script.sql
@@ -0,0 +1,624 @@
+--
+-- PostgreSQL database dump
+--
+
+SET client_encoding = 'LATIN1';
+SET check_function_bodies = false;
+
+--
+-- TOC entry 3 (OID 17145)
+-- Name: exilog; Type: SCHEMA; Schema: -; Owner:
+--
+
+CREATE SCHEMA exilog AUTHORIZATION exilog;
+
+
+SET SESSION AUTHORIZATION 'exilog';
+
+SET search_path = exilog, pg_catalog;
+
+--
+-- TOC entry 4 (OID 17181)
+-- Name: deferrals; Type: TABLE; Schema: exilog; Owner: exilog
+--
+
+CREATE TABLE deferrals (
+ server character varying(32) NOT NULL,
+ message_id character(16) NOT NULL,
+ "timestamp" bigint NOT NULL,
+ rcpt character varying(200) NOT NULL,
+ rcpt_intermediate character varying(200),
+ rcpt_final character varying(200) NOT NULL,
+ host_addr inet,
+ host_dns character varying(255),
+ tls_cipher character varying(128),
+ router character varying(128),
+ transport character varying(128),
+ shadow_transport character varying(128),
+ errmsg character varying(2048)
+);
+
+
+--
+-- TOC entry 5 (OID 17194)
+-- Name: errors; Type: TABLE; Schema: exilog; Owner: exilog
+--
+
+CREATE TABLE errors (
+ server character varying(32) NOT NULL,
+ message_id character(16) NOT NULL,
+ "timestamp" bigint NOT NULL,
+ rcpt character varying(200) NOT NULL,
+ rcpt_intermediate character varying(200),
+ rcpt_final character varying(200) NOT NULL,
+ host_addr inet,
+ host_dns character varying(255),
+ tls_cipher character varying(128),
+ router character varying(128),
+ transport character varying(128),
+ shadow_transport character varying(128),
+ errmsg character varying(2048)
+);
+
+
+--
+-- TOC entry 6 (OID 17207)
+-- Name: deliveries; Type: TABLE; Schema: exilog; Owner: exilog
+--
+
+CREATE TABLE deliveries (
+ server character varying(32) NOT NULL,
+ message_id character(16) NOT NULL,
+ "timestamp" bigint NOT NULL,
+ rcpt character varying(200) NOT NULL,
+ rcpt_intermediate character varying(200),
+ rcpt_final character varying(200) NOT NULL,
+ host_addr inet,
+ host_dns character varying(255),
+ tls_cipher character varying(128),
+ router character varying(128),
+ transport character varying(128),
+ shadow_transport character varying(128)
+);
+
+
+--
+-- TOC entry 7 (OID 17220)
+-- Name: queue; Type: TABLE; Schema: exilog; Owner: exilog
+--
+
+CREATE TABLE queue (
+ server character varying(32) NOT NULL,
+ message_id character(16) NOT NULL,
+ mailfrom character varying(255),
+ "timestamp" bigint,
+ num_dsn integer,
+ frozen bigint,
+ recipients_delivered bytea,
+ recipients_pending bytea,
+ spool_path character varying(64),
+ subject character varying(255),
+ msgid character varying(255),
+ headers bytea,
+ "action" character varying(64)
+);
+
+
+--
+-- TOC entry 8 (OID 17249)
+-- Name: unknown; Type: TABLE; Schema: exilog; Owner: exilog
+--
+
+CREATE TABLE "unknown" (
+ server character varying(32) NOT NULL,
+ message_id character(16) NOT NULL,
+ "timestamp" bigint NOT NULL,
+ line character varying(255) NOT NULL
+);
+
+
+--
+-- TOC entry 9 (OID 695844)
+-- Name: messages; Type: TABLE; Schema: exilog; Owner: exilog
+--
+
+CREATE TABLE messages (
+ server character varying(32) NOT NULL,
+ message_id character(16) NOT NULL,
+ "timestamp" bigint,
+ msgid character varying(255),
+ completed bigint,
+ mailfrom character varying(255),
+ host_addr inet,
+ host_rdns character varying(255),
+ host_ident character varying(255),
+ host_helo character varying(255),
+ proto character varying(32),
+ size bigint,
+ tls_cipher character varying(128),
+ "user" character varying(128),
+ bounce_parent character(16)
+);
+
+
+--
+-- TOC entry 10 (OID 695860)
+-- Name: rejects; Type: TABLE; Schema: exilog; Owner: exilog
+--
+
+CREATE TABLE rejects (
+ server character varying(32) NOT NULL,
+ message_id character(16),
+ "timestamp" bigint NOT NULL,
+ host_addr inet,
+ host_rdns character varying(255),
+ host_ident character varying(255),
+ host_helo character varying(255),
+ mailfrom character varying(255),
+ rcpt character varying(255),
+ errmsg character varying(255) NOT NULL
+);
+
+
+--
+-- TOC entry 16 (OID 17188)
+-- Name: deferrals_server; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deferrals_server ON deferrals USING btree (server);
+
+
+--
+-- TOC entry 12 (OID 17189)
+-- Name: deferrals_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deferrals_message_id ON deferrals USING btree (message_id);
+
+
+--
+-- TOC entry 18 (OID 17190)
+-- Name: deferrals_timestamp; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deferrals_timestamp ON deferrals USING btree ("timestamp");
+
+
+--
+-- TOC entry 14 (OID 17191)
+-- Name: deferrals_rcpt; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deferrals_rcpt ON deferrals USING btree (rcpt);
+
+
+--
+-- TOC entry 15 (OID 17192)
+-- Name: deferrals_rcpt_final; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deferrals_rcpt_final ON deferrals USING btree (rcpt_final);
+
+
+--
+-- TOC entry 11 (OID 17193)
+-- Name: deferrals_host_addr; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deferrals_host_addr ON deferrals USING btree (host_addr);
+
+
+--
+-- TOC entry 24 (OID 17199)
+-- Name: errors_server; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX errors_server ON errors USING btree (server);
+
+
+--
+-- TOC entry 20 (OID 17200)
+-- Name: errors_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX errors_message_id ON errors USING btree (message_id);
+
+
+--
+-- TOC entry 26 (OID 17201)
+-- Name: errors_timestamp; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX errors_timestamp ON errors USING btree ("timestamp");
+
+
+--
+-- TOC entry 22 (OID 17202)
+-- Name: errors_rcpt; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX errors_rcpt ON errors USING btree (rcpt);
+
+
+--
+-- TOC entry 23 (OID 17203)
+-- Name: errors_rcpt_final; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX errors_rcpt_final ON errors USING btree (rcpt_final);
+
+
+--
+-- TOC entry 19 (OID 17204)
+-- Name: errors_host_addr; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX errors_host_addr ON errors USING btree (host_addr);
+
+
+--
+-- TOC entry 32 (OID 17212)
+-- Name: deliveries_server; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deliveries_server ON deliveries USING btree (server);
+
+
+--
+-- TOC entry 28 (OID 17213)
+-- Name: deliveries_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deliveries_message_id ON deliveries USING btree (message_id);
+
+
+--
+-- TOC entry 34 (OID 17214)
+-- Name: deliveries_timestamp; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deliveries_timestamp ON deliveries USING btree ("timestamp");
+
+
+--
+-- TOC entry 30 (OID 17215)
+-- Name: deliveries_rcpt; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deliveries_rcpt ON deliveries USING btree (rcpt);
+
+
+--
+-- TOC entry 31 (OID 17216)
+-- Name: deliveries_rcpt_final; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deliveries_rcpt_final ON deliveries USING btree (rcpt_final);
+
+
+--
+-- TOC entry 27 (OID 17217)
+-- Name: deliveries_host_addr; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deliveries_host_addr ON deliveries USING btree (host_addr);
+
+
+--
+-- TOC entry 41 (OID 17241)
+-- Name: queue_server; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX queue_server ON queue USING btree (server);
+
+
+--
+-- TOC entry 38 (OID 17242)
+-- Name: queue_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX queue_message_id ON queue USING btree (message_id);
+
+
+--
+-- TOC entry 37 (OID 17243)
+-- Name: queue_mailfrom; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX queue_mailfrom ON queue USING btree (mailfrom);
+
+
+--
+-- TOC entry 44 (OID 17244)
+-- Name: queue_timestamp; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX queue_timestamp ON queue USING btree ("timestamp");
+
+
+--
+-- TOC entry 36 (OID 17245)
+-- Name: queue_frozen; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX queue_frozen ON queue USING btree (frozen);
+
+
+--
+-- TOC entry 43 (OID 17246)
+-- Name: queue_spool_path; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX queue_spool_path ON queue USING btree (spool_path);
+
+
+--
+-- TOC entry 39 (OID 17247)
+-- Name: queue_msgid; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX queue_msgid ON queue USING btree (msgid);
+
+
+--
+-- TOC entry 35 (OID 17248)
+-- Name: queue_action; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX queue_action ON queue USING btree ("action");
+
+
+--
+-- TOC entry 47 (OID 17253)
+-- Name: unknown_server; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX unknown_server ON "unknown" USING btree (server);
+
+
+--
+-- TOC entry 45 (OID 17254)
+-- Name: unknown_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX unknown_message_id ON "unknown" USING btree (message_id);
+
+
+--
+-- TOC entry 49 (OID 17255)
+-- Name: unknown_timestamp; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX unknown_timestamp ON "unknown" USING btree ("timestamp");
+
+
+--
+-- TOC entry 17 (OID 237716)
+-- Name: deferrals_server_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deferrals_server_message_id ON deferrals USING btree (server, message_id);
+
+
+--
+-- TOC entry 33 (OID 237717)
+-- Name: deliveries_server_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX deliveries_server_message_id ON deliveries USING btree (server, message_id);
+
+
+--
+-- TOC entry 25 (OID 237719)
+-- Name: errors_server_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX errors_server_message_id ON errors USING btree (server, message_id);
+
+
+--
+-- TOC entry 42 (OID 237725)
+-- Name: queue_server_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX queue_server_message_id ON queue USING btree (server, message_id);
+
+
+--
+-- TOC entry 48 (OID 237821)
+-- Name: unknown_server_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX unknown_server_message_id ON "unknown" USING btree (server, message_id);
+
+
+--
+-- TOC entry 57 (OID 695849)
+-- Name: server; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX server ON messages USING btree (server);
+
+
+--
+-- TOC entry 53 (OID 695850)
+-- Name: message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX message_id ON messages USING btree (message_id);
+
+
+--
+-- TOC entry 55 (OID 695851)
+-- Name: msgid; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX msgid ON messages USING btree (msgid);
+
+
+--
+-- TOC entry 58 (OID 695852)
+-- Name: timestamp; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX "timestamp" ON messages USING btree ("timestamp");
+
+
+--
+-- TOC entry 51 (OID 695853)
+-- Name: host_addr; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX host_addr ON messages USING btree (host_addr);
+
+
+--
+-- TOC entry 50 (OID 695854)
+-- Name: bounce_parent; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX bounce_parent ON messages USING btree (bounce_parent);
+
+
+--
+-- TOC entry 59 (OID 695855)
+-- Name: user; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX "user" ON messages USING btree ("user");
+
+
+--
+-- TOC entry 52 (OID 695856)
+-- Name: mailfrom; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX mailfrom ON messages USING btree (mailfrom);
+
+
+--
+-- TOC entry 54 (OID 695857)
+-- Name: messages_server_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX messages_server_message_id ON messages USING btree (server, message_id);
+
+
+--
+-- TOC entry 64 (OID 695865)
+-- Name: rejects_server; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX rejects_server ON rejects USING btree (server);
+
+
+--
+-- TOC entry 66 (OID 695866)
+-- Name: rejects_timestamp; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX rejects_timestamp ON rejects USING btree ("timestamp");
+
+
+--
+-- TOC entry 60 (OID 695867)
+-- Name: rejects_host_addr; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX rejects_host_addr ON rejects USING btree (host_addr);
+
+
+--
+-- TOC entry 61 (OID 695868)
+-- Name: rejects_mailfrom; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX rejects_mailfrom ON rejects USING btree (mailfrom);
+
+
+--
+-- TOC entry 63 (OID 695869)
+-- Name: rejects_rcpt; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX rejects_rcpt ON rejects USING btree (rcpt);
+
+
+--
+-- TOC entry 62 (OID 695870)
+-- Name: rejects_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX rejects_message_id ON rejects USING btree (message_id);
+
+
+--
+-- TOC entry 65 (OID 695871)
+-- Name: rejects_server_message_id; Type: INDEX; Schema: exilog; Owner: exilog
+--
+
+CREATE INDEX rejects_server_message_id ON rejects USING btree (server, message_id);
+
+
+--
+-- TOC entry 13 (OID 17186)
+-- Name: deferrals_primary; Type: CONSTRAINT; Schema: exilog; Owner: exilog
+--
+
+ALTER TABLE ONLY deferrals
+ ADD CONSTRAINT deferrals_primary PRIMARY KEY (server, message_id, "timestamp", rcpt, rcpt_final);
+
+
+--
+-- TOC entry 21 (OID 17205)
+-- Name: errors_primary; Type: CONSTRAINT; Schema: exilog; Owner: exilog
+--
+
+ALTER TABLE ONLY errors
+ ADD CONSTRAINT errors_primary PRIMARY KEY (server, message_id, "timestamp", rcpt, rcpt_final);
+
+
+--
+-- TOC entry 29 (OID 17218)
+-- Name: deliveries_primary; Type: CONSTRAINT; Schema: exilog; Owner: exilog
+--
+
+ALTER TABLE ONLY deliveries
+ ADD CONSTRAINT deliveries_primary PRIMARY KEY (server, message_id, "timestamp", rcpt, rcpt_final);
+
+
+--
+-- TOC entry 40 (OID 17239)
+-- Name: queue_primary; Type: CONSTRAINT; Schema: exilog; Owner: exilog
+--
+
+ALTER TABLE ONLY queue
+ ADD CONSTRAINT queue_primary PRIMARY KEY (server, message_id);
+
+
+--
+-- TOC entry 46 (OID 17251)
+-- Name: unknown_primary; Type: CONSTRAINT; Schema: exilog; Owner: exilog
+--
+
+ALTER TABLE ONLY "unknown"
+ ADD CONSTRAINT unknown_primary PRIMARY KEY (server, message_id, "timestamp", line);
+
+
+--
+-- TOC entry 56 (OID 695858)
+-- Name: primary; Type: CONSTRAINT; Schema: exilog; Owner: exilog
+--
+
+ALTER TABLE ONLY messages
+ ADD CONSTRAINT "primary" PRIMARY KEY (server, message_id);
+
+
+--
+-- TOC entry 67 (OID 695872)
+-- Name: rejects_unique; Type: CONSTRAINT; Schema: exilog; Owner: exilog
+--
+
+ALTER TABLE ONLY rejects
+ ADD CONSTRAINT rejects_unique UNIQUE (server, "timestamp", host_addr, errmsg);
+