+#include <stdio.h>
+#include <stdarg.h>
#include "../dbapi2/dbapi2.h"
#include "../core/error.h"
#include "../core/hooks.h"
#include "../core/schedule.h"
+#include "../control/control.h"
#include "trusts.h"
DBAPIConn *trustsdb;
);
/* I'd like multiple keys here but that's not gonna happen on a cross-database platform :( */
- trustsdb->createtable(trustsdb, NULL, NULL, "CREATE TABLE ? (id INT PRIMARY KEY, groupid INT, host VARCHAR(?), maxusage INT, lastseen INT)", "Td", hosts, TRUSTHOSTLEN);
+ trustsdb->createtable(trustsdb, NULL, NULL, "CREATE TABLE ? (id INT PRIMARY KEY, groupid INT, host VARCHAR(?), maxusage INT, created INT, lastseen INT)", "Td", hosts, TRUSTHOSTLEN);
+
+ trustsdb->createtable(trustsdb, NULL, NULL,
+ "CREATE TABLE ? (id INT PRIMARY KEY, groupid INT, groupname VARCHAR(?), ts INT, username VARCHAR(?), message VARCHAR(?))",
+ "Tddd", "log", TRUSTNAMELEN, CREATEDBYLEN, TRUSTLOGLEN
+ );
}
static void flushdatabase(void *arg) {
if(loaderror)
return;
- th_linktree();
trustsdbloaded = 1;
flushschedule = schedulerecurring(time(NULL) + 300, 0, 300, flushdatabase, NULL);
return;
}
- if(result->fields != 5) {
+ if(result->fields != 6) {
Error("trusts", ERR_ERROR, "Wrong number of fields in hosts table.");
loaderror = 1;
}
th.maxusage = strtoul(result->get(result, 3), NULL, 10);
- th.lastseen = (time_t)strtoul(result->get(result, 4), NULL, 10);
+ th.created = (time_t)strtoul(result->get(result, 4), NULL, 10);
+ th.lastseen = (time_t)strtoul(result->get(result, 5), NULL, 10);
if(!th_add(&th))
Error("trusts", ERR_WARNING, "Error adding host to trust %d: %s", groupid, host);
th_getsuperandsubsets(ith->ip, ith->mask, &superset, &subset);
th_adjusthosts(th, subset, superset);
- th_linktree();
return th;
}
nth.group = tg;
nth.id = thmaxid + 1;
+ nth.created = time(NULL);
nth.lastseen = 0;
nth.maxusage = 0;
void trustsdb_insertth(char *table, trusthost *th, unsigned int groupid) {
trustsdb->squery(trustsdb,
- "INSERT INTO ? (id, groupid, host, maxusage, lastseen) VALUES (?, ?, ?, ?, ?)",
- "Tuusut", table, th->id, groupid, trusts_cidr2str(th->ip, th->mask), th->maxusage, th->lastseen
+ "INSERT INTO ? (id, groupid, host, maxusage, created, lastseen) VALUES (?, ?, ?, ?, ?, ?)",
+ "Tuusuut", table, th->id, groupid, trusts_cidr2str(th->ip, th->mask), th->maxusage, th->created, th->lastseen
);
}
trustsdb_deleteth("hosts", th);
th_free(th);
+}
+
+void trustlog(trustgroup *tg, const char *user, const char *format, ...) {
+ char buf[TRUSTLOGLEN+1];
+ va_list va;
+ unsigned int now;
+
+ va_start(va, format);
+ vsnprintf(buf, sizeof(buf), format, va);
+ va_end(va);
+
+ now = time(NULL);
+
+ trustsdb->squery(trustsdb,
+ "INSERT INTO ? (ts, groupid, groupname, username, message) VALUES (?, ?, ?, ?, ?)",
+ "Tuusss", "log", now, tg->id, tg->name->content, user, buf);
+}
+
+static void trustlogquery_callback(const struct DBAPIResult *result, void *arg) {
+ nick *np = (nick *)arg;
+ int rows = 0;
+
+ if(!result || !result->success) {
+ controlreply(np, "Error querying the log.");
+
+ if(result)
+ result->clear(result);
+
+ return;
+ }
+
+ if(result->fields != 5) {
+ Error("trusts", ERR_ERROR, "Wrong number of fields in log table.");
+
+ result->clear(result);
+ return;
+ }
+
+ while(result->next(result)) {
+ unsigned int ts, groupid;
+ char *groupname, *user, *message;
+
+ ts = strtoul(result->get(result, 0), NULL, 10);
+ groupid = strtoul(result->get(result, 1), NULL, 10);
+ groupname = result->get(result, 2);
+ user = result->get(result, 3);
+ message = result->get(result, 4);
+
+ controlreply(np, "[%s] #%d/%s (%s) %s", trusts_timetostr(ts), groupid, groupname, user, message);
+ rows++;
+ }
+
+ result->clear(result);
+
+ controlreply(np, "--- Done. Found %d entries.", rows);
+}
+
+void trustlogspewid(nick *np, unsigned int groupid, unsigned int limit) {
+ trustsdb->query(trustsdb, trustlogquery_callback, (void *)np,
+ "SELECT ts, groupid, groupname, username, message FROM ? WHERE groupid = ? ORDER BY ts DESC LIMIT ?",
+ "Tuu", "log", groupid, limit);
+}
+
+void trustlogspewname(nick *np, const char *groupname, unsigned int limit) {
+ trustsdb->query(trustsdb, trustlogquery_callback, (void *)np,
+ "SELECT ts, groupid, groupname, username, message FROM ? WHERE groupname = ? ORDER BY ts DESC LIMIT ?",
+ "Tsu", "log", groupname, limit);
+}
+
+void trustloggrep(nick *np, const char *pattern, unsigned int limit) {
+ char buf[512];
+ snprintf(buf, sizeof(buf), "%%%s%%", pattern);
- th_linktree();
+ trustsdb->query(trustsdb, trustlogquery_callback, (void *)np,
+ "SELECT ts, groupid, groupname, username, message FROM ? WHERE message LIKE ? ORDER BY ts DESC LIMIT ?",
+ "Tsu", "log", buf, limit);
}
void _init(void) {