Selaa lähdekoodia

Log UA in the DB.

George Baugh 1 vuosi sitten
vanhempi
sitoutus
3cff5596d2
3 muutettua tiedostoa jossa 18 lisäystä ja 4 poistoa
  1. 2 1
      lib/TCMS.pm
  2. 4 3
      lib/Trog/Log/DBI.pm
  3. 12 0
      schema/log.schema

+ 2 - 1
lib/TCMS.pm

@@ -127,8 +127,9 @@ sub _app {
     #my $no_track = $env->{HTTP_DNT};
     #my $no_sell_info = $env->{HTTP_SEC_GPC};
 
-    # Set the referer to go into DB logs, but not logs in general.
+    # Set the referer & ua to go into DB logs, but not logs in general.
     $Trog::Log::DBI::referer = $env->{HTTP_REFERER};
+    $Trog::Log::DBI::ua      = $env->{HTTP_UA};
 
     # We generally prefer this to be handled at the reverse proxy level.
     #my $prefer_ssl = $env->{HTTP_UPGRADE_INSECURE_REQUESTS};

+ 4 - 3
lib/Trog/Log/DBI.pm

@@ -8,13 +8,13 @@ use parent qw{Log::Dispatch::DBI};
 use Ref::Util qw{is_arrayref};
 use Capture::Tiny qw{capture_merged};
 
-our $referer;
+our ($referer, $ua);
 
 sub create_statement {
     my $self = shift;
 
     # This is a writable view.  Consult schema for its behavior.
-    my $sql = "INSERT INTO all_requests (uuid, date, ip_address, user, method, route, code, referer) VALUES (?,?,?,?,?,?,?,?)";
+    my $sql = "INSERT INTO all_requests (uuid, date, ip_address, user, method, route, referer, ua, code) VALUES (?,?,?,?,?,?,?,?,?)";
 
     my $sql2 = "INSERT INTO messages (uuid, message) VALUES (?,?)";
     $self->{sth2} = $self->{dbh}->prepare($sql2);
@@ -47,8 +47,9 @@ sub log_message {
     # Allow callers to set referer.
     # We only care about this in DB context, as it's only for metrics, which are irrelevant in text logs/debugging.
     $referer //= 'none';
+    $ua      //= 'none';
 
-    my $res = $self->{sth}->execute($uuid, $date, $ip, $user, $method, $route, $code, $referer );
+    my $res = $self->{sth}->execute($uuid, $date, $ip, $user, $method, $route, $referer, $ua, $code );
 
     if (is_arrayref($buffer{$uuid}) && @{$buffer{$uuid}}) {
         $self->{sth2}->bind_param_array(1, $uuid);

+ 12 - 0
schema/log.schema

@@ -25,6 +25,11 @@ CREATE TABLE IF NOT EXISTS referer (
     referer TEXT NOT NULL UNIQUE
 );
 
+CREATE TABLE IF NOT EXISTS ua (
+    id INTEGER PRIMARY KEY AUTOINCREMENT,
+    ua TEXT NOT NULL UNIQUE
+);
+
 CREATE TABLE IF NOT EXISTS requests (
     uuid TEXT PRIMARY KEY,
     date TEXT NOT NULL,
@@ -32,6 +37,7 @@ CREATE TABLE IF NOT EXISTS requests (
     user_id INTEGER NOT NULL REFERENCES seen_users(id) ON DELETE CASCADE,
     route_id INTEGER NOT NULL REFERENCES seen_routes(id) ON DELETE CASCADE,
     referer_id INTEGER NOT NULL REFERENCES referer(id) ON DELETE CASCADE,
+    ua_id INTEGER NOT NULL REFERENCES ua(id) ON DELETE CASCADE,
     response_code_id INTEGER NOT NULL REFERENCES response_code(id) ON DELETE RESTRICT
 );
 
@@ -44,6 +50,7 @@ CREATE VIEW IF NOT EXISTS all_requests AS
         r.method,
         r.route,
         f.referer,
+        ua.ua,
         c.code
     FROM
         requests AS q
@@ -55,6 +62,8 @@ CREATE VIEW IF NOT EXISTS all_requests AS
         seen_routes AS r ON q.route_id = r.id
     JOIN
         referer AS f ON q.referer_id = f.id
+    JOIN
+        ua ON q.ua_id = ua.id
     JOIN
         response_code AS c on q.response_code_id = c.id;
 
@@ -65,6 +74,7 @@ CREATE TRIGGER IF NOT EXISTS insert_all_requests INSTEAD OF INSERT ON all_reques
     INSERT OR IGNORE INTO seen_users    (user)         VALUES (NEW.user);
     INSERT OR IGNORE INTO seen_hosts    (ip_address)   VALUES (NEW.ip_address);
     INSERT OR IGNORE INTO referer       (referer)      VALUES (NEW.referer);
+    INSERT OR IGNORE INTO ua            (ua)           VALUES (NEW.ua);
     INSERT OR REPLACE INTO requests SELECT
         NEW.uuid,
         NEW.date,
@@ -72,11 +82,13 @@ CREATE TRIGGER IF NOT EXISTS insert_all_requests INSTEAD OF INSERT ON all_reques
         u.id AS user_id,
         r.id AS route_id,
         f.id AS referer_id,
+        ua.id AS ua_id,
         c.id AS response_code_id
     FROM seen_hosts AS h
     JOIN seen_users AS u ON u.user = NEW.user
     JOIN seen_routes AS r ON r.route = NEW.route AND r.method = NEW.method
     JOIN referer AS f ON f.referer = NEW.referer
+    JOIN ua ON ua.ua = NEW.ua
     JOIN response_code AS c ON c.code = NEW.code
     WHERE h.ip_address = NEW.ip_address;
 END;