From c2a93a2d2b4f803ca52a5406bc3bedc0fb0f6587 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Fri, 8 Mar 2013 03:24:56 +0100 Subject: [PATCH] added parser --- admin/parse.php | 47 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/admin/parse.php b/admin/parse.php index 15e56ad..4d7029c 100755 --- a/admin/parse.php +++ b/admin/parse.php @@ -7,15 +7,15 @@ $sql = 'SELECT * FROM logs WHERE program = \'named\' + ORDER BY logged ASC LIMIT 10000'; $result = $db->query($sql); -$pattern = '/^queries: info: client ([.\d]+)#(\d+): query: ([+.-\w]+) ([A-Z]+) ([A-Z]+) (.*) \(([.\d]+)\)$/'; -$sqlDelete = 'DELETE FROM logs WHERE id IN ('; +$pattern = '/^queries: info: client ([.\d]+)#(\d+): query: ([+.-\w]+) ([A-Z]+) ([0-9A-Z]+) ([-+A-Z]+) \(([.\d]+)\)$/'; $queries = array(); -$c = 0; $u = 0; - +$update = array(); +$delete = array(); foreach ($result as $log) { if (preg_match($pattern, $log['message'], $matches)) { $query = array('ip' => new IpV4($matches[1]), @@ -28,13 +28,11 @@ foreach ($result as $log) { 'queried' => strtotime($log['logged'])); $db->execute('INSERT IGNORE INTO queries (ip, port, hostname, class, type, options, queried, log_id) VALUES (\'' . $query['ip'] . '\', ' . $query['port'] . ', \'' . $query['hostname'] . '\', \'' . $query['class'] . '\', \'' . $query['type'] . '\', \'' . $query['options'] . '\', \'' . date('Y-m-d H:i:s', $query['queried']) . '\', ' . $query['log_id'] . ')'); - $c++; - $sqlDelete .= $query['log_id'] . ', '; - $output->add('query parsed', 'debug', 3, $query); + $output->add('query parsed', 'debug', 3, $log['logged'], $log['message']); + array_push($delete, $query['log_id']); foreach ($config['sddns']['zones'] as $zone) { if (substr($query['hostname'], -strlen($zone->name)) == $zone->name && strlen($query['hostname']) > strlen($zone->name)) { - $filter = array('class' => $query['class'], 'type' => $query['type'], 'host' => substr($query['hostname'], 0, -(strlen($zone->name) + 1)), @@ -43,22 +41,41 @@ foreach ($result as $log) { $records = DBRecord::get($db, $filter); foreach ($records as $record) { + // remove older update requests + foreach ($update as $index => $updateRecord) { + if ($updateRecord->id == $record->id) { + unset($update[$index]); + } + } + $record->lastAccessed = $query['queried']; - $record->update(); - $output->add('record renewed', 'success', $record); + array_push($update, $record); } } } } + else { + $output->add('unmatching log entry', 'debug', 5, $log); + } } -if ($c > 0) { - $db->execute(substr($sqlDelete, 0, -2) . ')'); - $output->add('parsed queries', 'success', $c); +if (count($delete)) { + $sqlDelete = 'DELETE FROM logs WHERE id IN (' . implode($delete, ', ') . ');'; + + $db->execute($sqlDelete); + $deleted = $db->affectedRows(); + + $output->add('parsed queries', 'success', $deleted); } -else { - $output->add('no queries to parse', 'debug', 1); + +$updated = 0; +foreach ($update as $record) { + $record->update(); + $updated++; + + $output->add('record renewed', 'success', $record, date('Y-m-d H:m:s', $record->lastAccessed)); } +$output->add('renewed records', 'success', $updated); $output->send();