badguardhome/client/src/components/Logs/index.js

181 lines
5.9 KiB
JavaScript
Raw Normal View History

2018-08-30 14:25:33 +00:00
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import ReactTable from 'react-table';
import { saveAs } from 'file-saver/FileSaver';
import PageTitle from '../ui/PageTitle';
import Card from '../ui/Card';
import Loading from '../ui/Loading';
import Tooltip from '../ui/Tooltip';
2018-09-04 09:43:13 +00:00
import './Logs.css';
2018-08-30 14:25:33 +00:00
const DOWNLOAD_LOG_FILENAME = 'dns-logs.txt';
class Logs extends Component {
componentDidMount() {
// get logs on initialization if queryLogIsEnabled
if (this.props.dashboard.queryLogEnabled) {
this.props.getLogs();
}
}
componentDidUpdate(prevProps) {
// get logs when queryLog becomes enabled
if (this.props.dashboard.queryLogEnabled && !prevProps.dashboard.queryLogEnabled) {
this.props.getLogs();
}
}
renderTooltip(isFiltered, rule) {
if (rule) {
return (isFiltered && <Tooltip text={rule}/>);
}
return '';
}
2018-08-30 14:25:33 +00:00
renderLogs(logs) {
const columns = [{
Header: 'Time',
accessor: 'time',
2018-09-04 09:43:13 +00:00
maxWidth: 110,
2018-08-30 14:25:33 +00:00
}, {
Header: 'Domain name',
accessor: 'domain',
2018-09-04 09:43:13 +00:00
Cell: (row) => {
const response = row.value;
return (
<div className="logs__row logs__row--overflow" title={response}>
<div className="logs__text">
{response}
</div>
</div>
);
},
2018-08-30 14:25:33 +00:00
}, {
Header: 'Type',
accessor: 'type',
2018-09-04 09:43:13 +00:00
maxWidth: 60,
2018-08-30 14:25:33 +00:00
}, {
Header: 'Response',
accessor: 'response',
Cell: (row) => {
const responses = row.value;
2018-09-05 15:20:38 +00:00
const { reason } = row.original;
const isFiltered = row ? reason.indexOf('Filtered') === 0 : false;
const parsedFilteredReason = reason.replace('Filtered', 'Filtered by ');
const rule = row && row.original && row.original.rule;
2018-09-05 15:20:38 +00:00
if (isFiltered) {
return (
<div className="logs__row">
2018-09-07 16:06:09 +00:00
{this.renderTooltip(isFiltered, rule)}
<span className="logs__text" title={parsedFilteredReason}>
{parsedFilteredReason}
</span>
2018-09-05 15:20:38 +00:00
</div>
);
}
2018-08-30 14:25:33 +00:00
if (responses.length > 0) {
const liNodes = responses.map((response, index) =>
2018-09-04 09:43:13 +00:00
(<li key={index} title={response}>{response}</li>));
return (
<div className="logs__row">
{ this.renderTooltip(isFiltered, rule)}
<ul className="list-unstyled">{liNodes}</ul>
2018-09-04 09:43:13 +00:00
</div>
);
2018-08-30 14:25:33 +00:00
}
2018-09-04 09:43:13 +00:00
return (
<div className="logs__row">
{ this.renderTooltip(isFiltered, rule) }
<span>Empty</span>
</div>
);
2018-08-30 14:25:33 +00:00
},
}, {
Header: 'Client',
accessor: 'client',
2018-09-04 09:43:13 +00:00
maxWidth: 250,
},
];
2018-08-30 14:25:33 +00:00
if (logs) {
return (<ReactTable
data={logs}
2018-08-30 14:25:33 +00:00
columns={columns}
showPagination={false}
defaultPageSize={1000}
2018-08-30 14:25:33 +00:00
minRows={7}
noDataText="No logs found"
defaultSorted={[
{
id: 'time',
desc: true,
},
]}
getTrProps={(_state, rowInfo) => {
// highlight filtered requests
if (!rowInfo) {
return {};
}
return {
className: (rowInfo.original.reason.indexOf('Filtered') === 0 ? 'red' : ''),
};
}}
2018-08-30 14:25:33 +00:00
/>);
}
return undefined;
}
handleDownloadButton = async (e) => {
e.preventDefault();
const data = await this.props.downloadQueryLog();
const jsonStr = JSON.stringify(data);
const dataBlob = new Blob([jsonStr], { type: 'text/plain;charset=utf-8' });
saveAs(dataBlob, DOWNLOAD_LOG_FILENAME);
};
renderButtons(queryLogEnabled) {
return (<div className="card-actions-top">
<button
className="btn btn-success btn-standart mr-2"
type="submit"
onClick={() => this.props.toggleLogStatus(queryLogEnabled)}
>{queryLogEnabled ? 'Disable log' : 'Enable log'}</button>
{queryLogEnabled &&
<button
className="btn btn-primary btn-standart"
type="submit"
onClick={this.handleDownloadButton}
>Download log file</button> }
</div>);
}
render() {
const { queryLogs, dashboard } = this.props;
const { queryLogEnabled } = dashboard;
return (
<div>
<PageTitle title="Query Log" subtitle="DNS queries log" />
<Card>
{this.renderButtons(queryLogEnabled)}
{queryLogEnabled && queryLogs.processing && <Loading />}
{queryLogEnabled && !queryLogs.processing &&
this.renderLogs(queryLogs.logs)}
</Card>
</div>
);
}
}
Logs.propTypes = {
getLogs: PropTypes.func,
queryLogs: PropTypes.object,
dashboard: PropTypes.object,
toggleLogStatus: PropTypes.func,
downloadQueryLog: PropTypes.func,
};
export default Logs;