add client column and tooltip to blocked requests

This commit is contained in:
Maxim Topchu 2018-09-03 15:55:20 +03:00
parent f12ef5d504
commit bed92f89f0
4 changed files with 49 additions and 8 deletions

View File

@ -1,7 +1,7 @@
import { createAction } from 'redux-actions'; import { createAction } from 'redux-actions';
import round from 'lodash/round'; import round from 'lodash/round';
import { normalizeHistory, normalizeFilteringStatus } from '../helpers/helpers'; import { normalizeHistory, normalizeFilteringStatus, normalizeLogs } from '../helpers/helpers';
import Api from '../api/Api'; import Api from '../api/Api';
const apiClient = new Api(); const apiClient = new Api();
@ -175,7 +175,7 @@ export const getLogs = () => async (dispatch, getState) => {
const state = getState(); const state = getState();
const timer = setInterval(async () => { const timer = setInterval(async () => {
if (state.dashboard.isCoreRunning) { if (state.dashboard.isCoreRunning) {
const logs = await apiClient.getQueryLog(); const logs = normalizeLogs(await apiClient.getQueryLog());
dispatch(getLogsSuccess(logs)); dispatch(getLogsSuccess(logs));
clearInterval(timer); clearInterval(timer);
} }

View File

@ -0,0 +1,7 @@
.rt-tr-group .red {
background-color: #fff4f2;
}
.ReactTable .rt-th, .ReactTable .rt-td {
overflow: visible;
}

View File

@ -5,7 +5,8 @@ import { saveAs } from 'file-saver/FileSaver';
import PageTitle from '../ui/PageTitle'; import PageTitle from '../ui/PageTitle';
import Card from '../ui/Card'; import Card from '../ui/Card';
import Loading from '../ui/Loading'; import Loading from '../ui/Loading';
import { normalizeLogs } from '../../helpers/helpers'; import './Logs.css';
import Tooltip from '../ui/Tooltip';
const DOWNLOAD_LOG_FILENAME = 'dns-logs.txt'; const DOWNLOAD_LOG_FILENAME = 'dns-logs.txt';
@ -25,6 +26,13 @@ class Logs extends Component {
} }
} }
renderTooltip(isFiltered, rule) {
if (rule) {
return (isFiltered && <Tooltip text={rule}/>);
}
return '';
}
renderLogs(logs) { renderLogs(logs) {
const columns = [{ const columns = [{
Header: 'Time', Header: 'Time',
@ -42,19 +50,30 @@ class Logs extends Component {
accessor: 'response', accessor: 'response',
Cell: (row) => { Cell: (row) => {
const responses = row.value; const responses = row.value;
const isFiltered = row ? row.original.reason.indexOf('Filtered') === 0 : false;
const rule = row && row.original && row.original.rule;
if (responses.length > 0) { if (responses.length > 0) {
const liNodes = responses.map((response, index) => const liNodes = responses.map((response, index) =>
(<li key={index}>{response}</li>)); (<li key={index}>{response}</li>));
return (<ul className="list-unstyled">{liNodes}</ul>); return (<React.Fragment>
{ this.renderTooltip(isFiltered, rule)}
<ul className="list-unstyled">{liNodes}</ul>
</React.Fragment>);
} }
return 'Empty'; return (<React.Fragment>
{ this.renderTooltip(isFiltered, rule) }
<span>Empty</span>
</React.Fragment>);
}, },
}]; }, {
Header: 'Client',
accessor: 'client',
},
];
if (logs) { if (logs) {
const normalizedLogs = normalizeLogs(logs);
return (<ReactTable return (<ReactTable
data={normalizedLogs} data={logs}
columns={columns} columns={columns}
showPagination={false} showPagination={false}
minRows={7} minRows={7}
@ -65,6 +84,15 @@ class Logs extends Component {
desc: true, desc: true,
}, },
]} ]}
getTrProps={(_state, rowInfo) => {
// highlight filtered requests
if (!rowInfo) {
return {};
}
return {
className: (rowInfo.original.reason.indexOf('Filtered') === 0 ? 'red' : ''),
};
}}
/>); />);
} }
return undefined; return undefined;

View File

@ -14,6 +14,9 @@ export const normalizeLogs = logs => logs.map((log) => {
time, time,
question, question,
answer: response, answer: response,
reason,
client,
rule,
} = log; } = log;
const { host: domain, type } = question; const { host: domain, type } = question;
const responsesArray = response ? response.map((response) => { const responsesArray = response ? response.map((response) => {
@ -25,6 +28,9 @@ export const normalizeLogs = logs => logs.map((log) => {
domain, domain,
type, type,
response: responsesArray, response: responsesArray,
reason,
client,
rule,
}; };
}); });