public
nobgit
read
NobMail
Based on mailcow: dockerized
Languages
Repository composition by tracked source files.
PHP
49%
JavaScript
35%
HTML
9%
CSS
4%
Shell
2%
Python
1%
Lua
0%
Perl
0%
Ruby
0%
SCSS
0%
Create file
Wiki Documentation
Clone
https://nobgit.com/orgs/nobgit/nobmail.git
ssh://[email protected]:2222/orgs/nobgit/nobmail.git
Commit
Add Json log parser for Dovecot and Postfix containers
8c8bfc01
data/web/admin.php | 63 ++++++++++--------------------------------
data/web/inc/functions.inc.php | 26 +++++++++++++++++
data/web/js/admin.js | 33 ++++++++++++++++++++++
data/web/json_api.php | 36 ++++++++++++++++++++++++
4 files changed, 109 insertions(+), 49 deletions(-)
Diff
diff --git a/data/web/admin.php b/data/web/admin.php
index 6235b682..6c7033e5 100644
--- a/data/web/admin.php
+++ b/data/web/admin.php
@@ -9,7 +9,7 @@ $tfa_data = get_tfa();
<div class="container">
<h4><span class="glyphicon glyphicon-user" aria-hidden="true"></span> <?=$lang['admin']['access'];?></h4>
- <div class="panel-group" id="accordion_access">
+ <div class="panel-group">
<div class="panel panel-danger">
<div class="panel-heading"><?=$lang['admin']['admin_details'];?></div>
<div class="panel-body">
@@ -82,52 +82,7 @@ $tfa_data = get_tfa();
<div class="panel-body">
<form method="post">
<div class="table-responsive">
- <table class="table table-striped" id="domainadminstable">
- <thead>
- <tr>
- <th style="min-width: 100px;"><?=$lang['admin']['username'];?></th>
- <th style="min-width: 166px;"><?=$lang['admin']['admin_domains'];?></th>
- <th style="min-width: 76px;"><?=$lang['admin']['active'];?></th>
- <th style="min-width: 76px;"><?=$lang['tfa']['tfa'];?></th>
- <th style="text-align: right; min-width: 200px;"><?=$lang['admin']['action'];?></th>
- </tr>
- </thead>
- <tbody>
- <?php
- foreach (get_domain_admins() as $domain_admin) {
- $da_data = get_domain_admin_details($domain_admin);
- if (!empty($da_data)):
- ?>
- <tr id="data">
- <td><?=htmlspecialchars(strtolower($domain_admin));?></td>
- <td>
- <?php
- foreach ($da_data['selected_domains'] as $domain) {
- echo htmlspecialchars($domain).'<br />';
- }
- ?>
- </td>
- <td><?=$da_data['active'];?></td>
- <td><?=empty($da_data['tfa_active_int']) ? "✘" : "✔";?></td>
- <td style="text-align: right;">
- <div class="btn-group">
- <a href="edit.php?domainadmin=<?=$domain_admin;?>" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-pencil"></span> <?=$lang['admin']['edit'];?></a>
- <a href="delete.php?domainadmin=<?=$domain_admin;?>" class="btn btn-xs btn-danger"><span class="glyphicon glyphicon-trash"></span> <?=$lang['admin']['remove'];?></a>
- </div>
- </td>
- </td>
- </tr>
-
- <?php
- else:
- ?>
- <tr id="no-data"><td colspan="4" style="text-align: center; font-style: italic;"><?=$lang['admin']['no_record'];?></td></tr>
- <?php
- endif;
- }
- ?>
- </tbody>
- </table>
+ <table class="table table-striped" id="domainadminstable"></table>
</div>
</form>
<small>
@@ -185,7 +140,7 @@ $tfa_data = get_tfa();
<h4><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span> <?=$lang['admin']['configuration'];?></h4>
- <div class="panel-group" id="accordion_access">
+ <div class="panel-group">
<div class="panel panel-default">
<div class="panel-heading"><?=$lang['admin']['dkim_keys'];?></div>
@@ -372,9 +327,19 @@ $tfa_data = get_tfa();
</form>
</div>
</div>
-
</div>
+ <h4><span class="glyphicon glyphicon-book" aria-hidden="true"></span> Mail Logs</h4>
+ <div class="panel-group">
+ <div class="panel panel-default">
+ <div class="panel-heading">Logs</div>
+ <div class="panel-body">
+ <div class="table-responsive">
+ <table class="table table-striped" id="dovecot_log"></table>
+ </div>
+ </div>
+ </div>
+ </div>
</div> <!-- /container -->
<script type='text/javascript'>
<?php
diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php
index 3fb03170..d4f7dcc5 100644
--- a/data/web/inc/functions.inc.php
+++ b/data/web/inc/functions.inc.php
@@ -5181,4 +5181,30 @@ function delete_forwarding_host($postarray) {
'msg' => sprintf($lang['success']['forwarding_host_removed'], htmlspecialchars($host))
);
}
+function get_logs($container, $lines = 100) {
+ global $lang;
+ global $redis;
+ if ($_SESSION['mailcow_cc_role'] != "admin") {
+ $_SESSION['return'] = array(
+ 'type' => 'danger',
+ 'msg' => sprintf($lang['danger']['access_denied'])
+ );
+ return false;
+ }
+ $lines = intval($lines);
+ if ($container == "dovecot-mailcow") {
+ if ($data = $redis->lRange('DOVECOT_MAILLOG', 1, $lines)) {
+ foreach ($data as $json_line) {
+ $data_array[] = json_decode($json_line, true);
+ }
+ return $data_array;
+ }
+ }
+ if ($container == "postfix-mailcow") {
+ if ($data = $redis->lRange('POSTFIX_MAILLOG', 1, $lines)) {
+ return $data;
+ }
+ }
+ return false;
+}
?>
diff --git a/data/web/js/admin.js b/data/web/js/admin.js
index 647dba9a..0b9d4e7a 100644
--- a/data/web/js/admin.js
+++ b/data/web/js/admin.js
@@ -39,4 +39,37 @@ $(document).ready(function() {
});
}
});
+ $.ajax({
+ dataType: 'json',
+ url: '/api/v1/get/logs/dovecot/all',
+ jsonp: false,
+ error: function () {
+ alert('Cannot draw dovecot log table');
+ },
+ success: function (data) {
+ $('#dovecot_log').footable({
+ "columns": [
+ {"name":"time","title":"time"},
+ {"name":"program","title":"program"},
+ {"name":"priority","title":"priority"},
+ {"name":"message","title":"message"},
+ ],
+ "rows": data,
+ "empty": lang.empty,
+ "paging": {
+ "enabled": true,
+ "limit": 5,
+ "size": pagination_size
+ },
+ "filtering": {
+ "enabled": true,
+ "position": "left",
+ "placeholder": lang.filter_table
+ },
+ "sorting": {
+ "enabled": true
+ }
+ });
+ }
+ });
});
\ No newline at end of file
diff --git a/data/web/json_api.php b/data/web/json_api.php
index 42918163..ba6ff70c 100644
--- a/data/web/json_api.php
+++ b/data/web/json_api.php
@@ -22,6 +22,7 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
$action = (isset($query[0])) ? $query[0] : null;
$category = (isset($query[1])) ? $query[1] : null;
$object = (isset($query[2])) ? $query[2] : null;
+ $extra = (isset($query[3])) ? $query[3] : null;
switch ($action) {
case "get":
@@ -57,6 +58,41 @@ if (isset($_SESSION['mailcow_cc_role']) || isset($_SESSION['pending_mailcow_cc_u
break;
}
break;
+ case "logs":
+ switch ($object) {
+ case "dovecot":
+ if (isset($extra) && !empty($extra) && is_int($extra)) {
+ $extra = intval($extra);
+ $logs = get_logs('dovecot-mailcow', $extra);
+ }
+ else {
+ $logs = get_logs('dovecot-mailcow', -1);
+ }
+ if (isset($logs) && !empty($logs)) {
+ echo json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+ }
+ else {
+ echo '{}';
+ }
+ break;
+
+ case "postfix":
+ if (isset($extra) && !empty($extra) && is_int($extra)) {
+ $extra = intval($extra);
+ $logs = get_logs('postfix-mailcow', $extra);
+ }
+ else {
+ $logs = get_logs('postfix-mailcow', -1);
+ }
+ if (isset($logs) && !empty($logs)) {
+ echo json_encode($logs, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
+ }
+ else {
+ echo '{}';
+ }
+ break;
+ }
+ break;
case "mailbox":
switch ($object) {
case "all":