Merge branch 'extend-add-new-agent-1767' of https://github.com/wazuh/wazuh-kibana-app

This commit is contained in:
JuanCarlos 2019-09-26 09:37:34 +02:00
commit 7e56d49a75
No known key found for this signature in database
GPG Key ID: B1C4FB733616273A
8 changed files with 460 additions and 323 deletions

View File

@ -99,9 +99,11 @@ export class AgentsPreviewController {
this.registerAgentsProps = {
addNewAgent: flag => this.addNewAgent(flag),
getWazuhVersion: () => this.getWazuhVersion()
getWazuhVersion: () => this.getWazuhVersion(),
getCurrentApiAddress: () => this.getCurrentApiAddress(),
needsPassword: () => this.needsPassword()
};
this.hasAgents = true;
this.init = false;
//Load
this.load();
@ -230,7 +232,12 @@ export class AgentsPreviewController {
this.lastAgent = unique.lastAgent;
this.summary = unique.summary;
if (!this.lastAgent || !this.lastAgent.id) {
this.addNewAgent(true);
if (this.addingNewAgent === undefined) {
this.addNewAgent(true);
}
this.hasAgents = false;
} else {
this.hasAgents = true;
}
if (agentsTop.data.data === '') {
@ -285,6 +292,37 @@ export class AgentsPreviewController {
);
}
/**
* Returns if the password is neccesary to register a new agent
*/
async needsPassword() {
try {
const result = await this.apiReq.request('GET', '/agents/000/config/auth/auth', {});
const auth = ((result.data || {}).data || {}).auth || {};
const usePassword = auth.use_password === 'yes';
return usePassword;
} catch (error) {
return false;
}
}
/**
* Returns the current API address
*/
async getCurrentApiAddress() {
try {
const result = await this.genericReq.request('GET', '/elastic/apis');
const entries = result.data || [];
const host = entries.filter(e => {return e._id == this.api});
const url = host[0]._source.url;
const numToClean = url.startsWith('https://') ? 8 : 7;
return url.substr(numToClean);
} catch (error) {
return false;
}
}
/**
* Returns the Wazuh version as x.y.z
*/

View File

@ -39,15 +39,25 @@ export class RegisterAgent extends Component {
this.state = {
status: 'incomplete',
selectedOS: '',
serverAddress: ''
serverAddress: '',
wazuhPassword: ''
};
}
async componentDidMount() {
try {
this.wazuhVersion = await this.props.getWazuhVersion();
const wazuhVersion = await this.props.getWazuhVersion();
const apiAddress = await this.props.getCurrentApiAddress();
const needsPassword = await this.props.needsPassword();
this.setState({
serverAddress: apiAddress,
needsPassword: needsPassword,
wazuhVersion: wazuhVersion
})
} catch (error) {
this.wazuhVersion = version;
this.setState({
wazuhVersion: version
})
}
}
@ -59,6 +69,21 @@ export class RegisterAgent extends Component {
this.setState({ serverAddress: event.target.value });
}
setWazuhPassword(event) {
this.setState({ wazuhPassword: event.target.value });
}
/**
* Checks if the password is not needed, in that case remove the input password step
* @param {Array} steps
*/
cleanSteps(steps) {
if (this.state.needsPassword) return steps;
steps.splice(2,1);
return steps;
}
render() {
const rpmButton = (
<EuiButtonToggle
@ -100,6 +125,14 @@ export class RegisterAgent extends Component {
/>
);
const passwordInput = (
<EuiFieldText
placeholder="Wazuh password..."
value={this.state.wazuhPassword}
onChange={event => this.setWazuhPassword(event)}
/>
);
const copyButton = {
position: 'relative',
float: 'right',
@ -112,10 +145,10 @@ export class RegisterAgent extends Component {
zIndex: '100'
};
const customTexts = {
rpmText: `sudo WAZUH_MANAGER_IP='${this.state.serverAddress}' yum install https://packages.wazuh.com/3.x/yum/wazuh-agent-${this.wazuhVersion}-1.x86_64.rpm`,
debText: `curl -so wazuh-agent.deb https://packages.wazuh.com/3.x/apt/pool/main/w/wazuh-agent/wazuh-agent_${this.wazuhVersion}-1_amd64.deb && sudo WAZUH_MANAGER_IP='${this.state.serverAddress}' dpkg -i ./wazuh-agent.deb`,
macosText: `curl -so wazuh-agent.pkg https://packages.wazuh.com/3.x/osx/wazuh-agent-${this.wazuhVersion}-1.pkg && sudo launchctl setenv WAZUH_MANAGER_IP '${this.state.serverAddress}' && sudo installer -pkg ./wazuh-agent.pkg -target /`,
winText: `Invoke-WebRequest -Uri https://packages.wazuh.com/3.x/windows/wazuh-agent-${this.wazuhVersion}-1.msi -OutFile wazuh-agent.msi; wazuh-agent.msi /q ADDRESS='${this.state.serverAddress}' AUTHD_SERVER='${this.state.serverAddress}'`
rpmText: `sudo WAZUH_MANAGER_IP='${this.state.serverAddress}'${this.state.needsPassword ? ` WAZUH_PASSWORD='${this.state.wazuhPassword}' ` : ' '}yum install https://packages.wazuh.com/3.x/yum/wazuh-agent-${this.state.wazuhVersion}-1.x86_64.rpm`,
debText: `curl -so wazuh-agent.deb https://packages.wazuh.com/3.x/apt/pool/main/w/wazuh-agent/wazuh-agent_${this.state.wazuhVersion}-1_amd64.deb && sudo WAZUH_MANAGER_IP='${this.state.serverAddress}'${this.state.needsPassword ? ` WAZUH_PASSWORD='${this.state.wazuhPassword}' ` : ' '} dpkg -i ./wazuh-agent.deb`,
macosText: `curl -so wazuh-agent.pkg https://packages.wazuh.com/3.x/osx/wazuh-agent-${this.state.wazuhVersion}-1.pkg && sudo launchctl setenv WAZUH_MANAGER_IP '${this.state.serverAddress}'${this.state.needsPassword ? ` setenv WAZUH_PASSWORD '${this.state.wazuhPassword}' ` : ' '} && sudo installer -pkg ./wazuh-agent.pkg -target /`,
winText: `Invoke-WebRequest -Uri https://packages.wazuh.com/3.x/windows/wazuh-agent-${this.state.wazuhVersion}-1.msi -OutFile wazuh-agent.msi; wazuh-agent.msi /q ADDRESS='${this.state.serverAddress}' AUTHD_SERVER='${this.state.serverAddress}'${this.state.needsPassword ? ` PASSWORD='${this.state.wazuhPassword}' ` : ' '}`
};
const field = `${this.state.selectedOS}Text`;
@ -166,6 +199,10 @@ export class RegisterAgent extends Component {
title: 'Wazuh server address',
children: <Fragment>{ipInput}</Fragment>
},
{
title: 'Wazuh password',
children: <Fragment>{passwordInput}</Fragment>
},
{
title: 'Complete the installation',
children: (
@ -180,12 +217,12 @@ export class RegisterAgent extends Component {
return (
<div>
<EuiPage restrictWidth="1000px">
<EuiPage restrictWidth="1000px" style={{background: "transparent"}} >
<EuiPageBody>
<EuiFlexGroup>
<EuiFlexItem>
<EuiTitle>
<h2>Add a new agent</h2>
<h2>Deploy a new agent</h2>
</EuiTitle>
</EuiFlexItem>
<EuiFlexItem grow={false}>
@ -202,7 +239,7 @@ export class RegisterAgent extends Component {
<EuiFlexItem>
<EuiPanel>
<EuiFlexItem>
<EuiSteps steps={steps} />
<EuiSteps steps={this.cleanSteps(steps)} />
</EuiFlexItem>
</EuiPanel>
</EuiFlexItem>
@ -216,5 +253,7 @@ export class RegisterAgent extends Component {
RegisterAgent.propTypes = {
addNewAgent: PropTypes.func,
getWazuhVersion: PropTypes.func
getWazuhVersion: PropTypes.func,
getCurrentApiAddress: PropTypes.func,
needsPassword: PropTypes.func
};

View File

@ -85,127 +85,71 @@
</div>
</div>
<!-- XML editor for group agents -->
<div ng-controller="agentsPreviewController as actrl">
<div ng-if="!editingFile">
<div layout="row" class="md-padding" ng-if="lookingGroup && currentGroup && addingAgents">
<span ng-click='addMultipleAgents(false)' class='wz-margin-top-3 kuiButton kuiButton--hollow'>
Cancel</span>
<span ng-hide='moreThan500' ng-click='saveAddAgents()' class='btn wz-button wz-margin-left-8'><i
aria-hidden='true' class='fa fa-fw fa-save'></i>
Apply changes</span>
<span class='error-msg' ng-show='moreThan500'><i class="fa fa-exclamation-triangle"></i> It is not
possible to apply changes of more than 500 additions or deletions</span>
</div>
<!-- Search bar -->
<div layout="row" class="wz-margin-top-16 euiFlexGroup euiFlexGroup--alignItemsCenter euiFormControlLayout__childrenWrapper md-padding-h ng-scope"
ng-if="!addingAgents && !file">
<input placeholder="{{groupsSelectedTab==='files' ? 'Filter files...' : lookingGroup ? 'Filter agents...' : 'Filter groups...'}}"
ng-model="custom_search" type="text" class="euiFieldSearch euiFieldSearch--fullWidth euiFlexItem height-35 ng-empty ng-pristine ng-touched ng-valid"
aria-invalid="false" wz-enter="search(custom_search)">
<div class="euiFormControlLayoutIcons wz-margin-left-16">
<span class="euiFormControlLayoutCustomIcon">
<react-component name="EuiIcon" props="{type:'search', className:'euiFormControlLayoutCustomIcon__icon'}" />
</span>
<div ng-if="!editingFile">
<div ng-show="!actrl.addingNewAgent">
<div layout="row" class="md-padding" ng-if="lookingGroup && currentGroup && addingAgents">
<span ng-click='addMultipleAgents(false)' class='wz-margin-top-3 kuiButton kuiButton--hollow'>
Cancel
</span>
<span ng-hide='moreThan500' ng-click='saveAddAgents()' class='btn wz-button wz-margin-left-8'>
<i aria-hidden='true' class='fa fa-fw fa-save'></i>
Apply changes
</span>
<span class='error-msg' ng-show='moreThan500'>
<i class="fa fa-exclamation-triangle"></i>
It is not possible to apply changes of more than 500 additions or deletions
</span>
</div>
</div>
<button type="submit" aria-label="Search" class="euiFlexItem euiFlexItem--flexGrowZero height-35 kuiButton kuiButton--secondary wz-margin-left-8"
ng-click="search(custom_search)">
Search
</button>
<div ng-if="lookingGroup && currentGroup && !addingAgents && !editingFile && !file && adminMode"
class="euiFlexItem euiFlexItem--flexGrowZero height-35 wz-margin-left-8">
<div class="euiFilterGroup"></div>
<!-- Search bar -->
<div layout="row" class="wz-margin-top-16 euiFlexGroup euiFlexGroup--alignItemsCenter euiFormControlLayout__childrenWrapper md-padding-h ng-scope"
ng-if="!addingAgents && !file">
<input placeholder="{{groupsSelectedTab==='files' ? 'Filter files...' : lookingGroup ? 'Filter agents...' : 'Filter groups...'}}"
ng-model="custom_search" type="text" class="euiFieldSearch euiFieldSearch--fullWidth euiFlexItem height-35 ng-empty ng-pristine ng-touched ng-valid"
aria-invalid="false" wz-enter="search(custom_search)">
<div class="euiFormControlLayoutIcons wz-margin-left-16">
<span class="euiFormControlLayoutCustomIcon">
<react-component name="EuiIcon" props="{type:'search', className:'euiFormControlLayoutCustomIcon__icon'}" />
</span>
</div>
<button type="submit" aria-label="Search" class="euiFlexItem euiFlexItem--flexGrowZero height-35 kuiButton kuiButton--secondary wz-margin-left-8"
ng-click="search(custom_search)">
Search
</button>
<div ng-if="lookingGroup && currentGroup && !addingAgents && !editingFile && !file && adminMode"
class="euiFlexItem euiFlexItem--flexGrowZero height-35 wz-margin-left-8">
<div class="euiFilterGroup"></div>
</div>
<button ng-if="lookingGroup && currentGroup && !addingAgents && !editingFile && !file && adminMode && groupsSelectedTab==='files'"
class="euiFlexItem euiFlexItem--flexGrowZero height-35 kuiButton kuiButton--secondary ng-scope wz-margin-left-8"
ng-click="editGroupAgentConfig(currentGroup)" aria-label="Edit group configuration">
<react-component name="EuiIcon" props="{type:'pencil', color:'primary'}" />
Edit group configuration
</button>
<button ng-if="lookingGroup && currentGroup && !addingAgents && !editingFile && !file && adminMode && groupsSelectedTab==='agents'"
class="euiFlexItem euiFlexItem--flexGrowZero height-35 kuiButton kuiButton--secondary ng-scope wz-margin-left-8"
ng-click="addMultipleAgents(true)" aria-label="Add or remove agents">
<react-component name="EuiIcon" props="{type:'plusInCircle', color:'primary'}" />
Add or remove agents
</button>
</div>
<button ng-if="lookingGroup && currentGroup && !addingAgents && !editingFile && !file && adminMode && groupsSelectedTab==='files'"
class="euiFlexItem euiFlexItem--flexGrowZero height-35 kuiButton kuiButton--secondary ng-scope wz-margin-left-8"
ng-click="editGroupAgentConfig(currentGroup)" aria-label="Edit group configuration">
<react-component name="EuiIcon" props="{type:'pencil', color:'primary'}" />
Edit group configuration
</button>
<button ng-if="lookingGroup && currentGroup && !addingAgents && !editingFile && !file && adminMode && groupsSelectedTab==='agents'"
class="euiFlexItem euiFlexItem--flexGrowZero height-35 kuiButton kuiButton--secondary ng-scope wz-margin-left-8"
ng-click="addMultipleAgents(true)" aria-label="Add or remove agents">
<react-component name="EuiIcon" props="{type:'plusInCircle', color:'primary'}" />
Add or remove agents
</button>
<!-- End search bar -->
</div>
<!-- End search bar -->
<!-- Groups table -->
<md-card flex class="wz-md-card _md flex md-margin-h wz-margin-top-16" ng-if="!lookingGroup">
<md-card-content>
<div layout="row">
<wz-table custom-columns="true" flex path="'/agents/groups'" keys="['name','count','mergedSum']"
allow-click="true" row-sizes="[14,12,10]">
</wz-table>
</div>
<div layout="row" layout-align="end center">
<button type="button" ng-click="downloadCsv('/agents/groups')" class="euiButtonEmpty euiButtonEmpty--primary euiButtonEmpty--small">
<span class="euiButtonEmpty__content">
<react-component name="EuiIcon" props="{type:'importAction'}" />
<span class="euiButtonEmpty__text">Formatted</span>
</span>
</button>
</div>
</md-card-content>
</md-card>
<!-- End groups table -->
<div ng-if='!addingAgents'>
<!-- Group agents table -->
<md-card flex class="wz-md-card _md flex md-margin-h wz-margin-top-16" ng-if="lookingGroup && groupsSelectedTab==='agents' && currentGroup">
<md-card-actions layout="row" class="wz-card-actions wz-card-actions-top layout-align-end-center">
<react-component name="ExportConfiguration" ng-hide="reportBusy && reportStatus" props="{exportConfiguration, type: 'group'}" />
<react-component ng-show="reportBusy && reportStatus" name="EuiLoadingSpinner" props="{size:'m'}" />
</md-card-actions>
<div layout="row" ng-show="failedErrors" class="extraHeader">
<md-list>
<md-list-item class="error-enum-configuration" ng-repeat="group in failedErrors">
<span class="wz-agent-status-indicator small red-text padding-left-0"><span
ng-repeat="error in group">{{error.id}}{{$last
? '' : ',&nbsp;'}}</span>: {{group[0].message}}</span>
</md-list-item>
</md-list>
<span flex></span>
<a class='md-padding md-padding-top-10' ng-click='clearFailedErrors()'><i class="fa fa-times"
aria-hidden="true"></i></a>
</div>
<!-- Groups table -->
<md-card flex class="wz-md-card _md flex md-margin-h wz-margin-top-16" ng-if="!lookingGroup">
<md-card-content>
<div layout="row">
<wz-table flex custom-columns="true" path="'/agents/groups/' + currentGroup.name" keys="['id','name','ip','status','os.name','os.version','version']"
allow-click="true" row-sizes="[14,12,10]" empty-results="'No agents were added to this group.'" />
</div>
<div layout="row" ng-if="lookingGroup && groupsSelectedTab==='agents'">
<span flex></span>
<button type="button" ng-click="downloadCsv('/agents/groups/' + currentGroup.name)"
class="euiButtonEmpty euiButtonEmpty--primary euiButtonEmpty--small">
<span class="euiButtonEmpty__content">
<react-component name="EuiIcon" props="{type:'importAction'}" />
<span class="euiButtonEmpty__text">Formatted</span>
</span>
</button>
</div>
</md-card-content>
</md-card>
<!-- Group files table -->
<md-card flex class="wz-md-card _md flex md-margin-h wz-margin-top-16" ng-if="lookingGroup && groupsSelectedTab==='files' && !fileViewer && currentGroup">
<md-card-actions layout="row" class="wz-card-actions wz-card-actions-top layout-align-end-center">
<react-component name="ExportConfiguration" ng-hide="reportBusy && reportStatus" props="{exportConfiguration, type: 'group'}" />
<react-component ng-show="reportBusy && reportStatus" name="EuiLoadingSpinner" props="{size:'m'}" />
</md-card-actions>
<md-card-content>
<div layout="row">
<wz-table custom-columns="true" flex path="'/agents/groups/' + currentGroup.name + '/files'"
keys="[{value:'filename',width:'300px'},'hash']" allow-click="true" row-sizes="[16,14,12]">
<wz-table custom-columns="true" flex path="'/agents/groups'" keys="['name','count','mergedSum']"
allow-click="true" row-sizes="[14,12,10]">
</wz-table>
</div>
<div layout="row" ng-if="lookingGroup && groupsSelectedTab==='files' && !file">
<span flex></span>
<button type="button" ng-click="downloadCsv('/agents/groups/' + currentGroup.name + '/files')"
class="euiButtonEmpty euiButtonEmpty--primary euiButtonEmpty--small">
<div layout="row" layout-align="end center">
<button type="button" ng-click="downloadCsv('/agents/groups')" class="euiButtonEmpty euiButtonEmpty--primary euiButtonEmpty--small">
<span class="euiButtonEmpty__content">
<react-component name="EuiIcon" props="{type:'importAction'}" />
<span class="euiButtonEmpty__text">Formatted</span>
@ -214,38 +158,115 @@
</div>
</md-card-content>
</md-card>
<!-- End Group files table -->
<!-- End groups table -->
<!-- CSV Download button section for group files-->
<!-- End CSV Download button section for group files -->
<!-- File JSON viewer section -->
<div flex layout="column" class="md-padding" ng-if="lookingGroup && groupsSelectedTab==='files' && file">
<div flex layout="column">
<div layout="row" class="wz-padding-bottom-14">
<span flex class="wz-headline-title">{{ filename }}</span>
<button class="md-icon-button" ng-if="lookingGroup" aria-label="Back" tooltip="Close file"
tooltip-placement="left" ng-click="goBackFiles()"><i class="fa fa-fw fa-close"
aria-hidden="true"></i></button>
<!--<span flex class="wz-text-right cursor-pointer color-grey" ng-click="goBackFiles()">close</span>-->
<div ng-if='!addingAgents'>
<!-- Group agents table -->
<md-card flex class="wz-md-card _md flex md-margin-h wz-margin-top-16" ng-if="lookingGroup && groupsSelectedTab==='agents' && currentGroup">
<md-card-actions layout="row" class="wz-card-actions wz-card-actions-top layout-align-end-center">
<react-component name="ExportConfiguration" ng-hide="reportBusy && reportStatus" props="{exportConfiguration, type: 'group'}" />
<react-component ng-show="reportBusy && reportStatus" name="EuiLoadingSpinner" props="{size:'m'}" />
</md-card-actions>
<div layout="row" ng-show="failedErrors" class="extraHeader">
<md-list>
<md-list-item class="error-enum-configuration" ng-repeat="group in failedErrors">
<span class="wz-agent-status-indicator small red-text padding-left-0"><span
ng-repeat="error in group">{{error.id}}{{$last
? '' : ',&nbsp;'}}</span>: {{group[0].message}}</span>
</md-list-item>
</md-list>
<span flex></span>
<a class='md-padding md-padding-top-10' ng-click='clearFailedErrors()'><i class="fa fa-times"
aria-hidden="true"></i></a>
</div>
<md-card-content>
<div layout="row">
<wz-table flex custom-columns="true" path="'/agents/groups/' + currentGroup.name" keys="['id','name','ip','status','os.name','os.version','version']"
allow-click="true" row-sizes="[14,12,10]" empty-results="'No agents were added to this group.'" />
</div>
<div layout="row" ng-if="lookingGroup && groupsSelectedTab==='agents'">
<span flex></span>
<button type="button" ng-click="downloadCsv('/agents/groups/' + currentGroup.name)"
class="euiButtonEmpty euiButtonEmpty--primary euiButtonEmpty--small">
<span class="euiButtonEmpty__content">
<react-component name="EuiIcon" props="{type:'importAction'}" />
<span class="euiButtonEmpty__text">Formatted</span>
</span>
</button>
</div>
</md-card-content>
</md-card>
<!-- Group files table -->
<md-card flex class="wz-md-card _md flex md-margin-h wz-margin-top-16" ng-if="lookingGroup && groupsSelectedTab==='files' && !fileViewer && currentGroup">
<md-card-actions layout="row" class="wz-card-actions wz-card-actions-top layout-align-end-center">
<react-component name="ExportConfiguration" ng-hide="reportBusy && reportStatus" props="{exportConfiguration, type: 'group'}" />
<react-component ng-show="reportBusy && reportStatus" name="EuiLoadingSpinner" props="{size:'m'}" />
</md-card-actions>
<md-card-content>
<div layout="row">
<wz-table custom-columns="true" flex path="'/agents/groups/' + currentGroup.name + '/files'"
keys="[{value:'filename',width:'300px'},'hash']" allow-click="true" row-sizes="[16,14,12]">
</wz-table>
</div>
<div layout="row" ng-if="lookingGroup && groupsSelectedTab==='files' && !file">
<span flex></span>
<button type="button" ng-click="downloadCsv('/agents/groups/' + currentGroup.name + '/files')"
class="euiButtonEmpty euiButtonEmpty--primary euiButtonEmpty--small">
<span class="euiButtonEmpty__content">
<react-component name="EuiIcon" props="{type:'importAction'}" />
<span class="euiButtonEmpty__text">Formatted</span>
</span>
</button>
</div>
</md-card-content>
</md-card>
<!-- End Group files table -->
<!-- CSV Download button section for group files-->
<!-- End CSV Download button section for group files -->
<!-- File JSON viewer section -->
<div flex layout="column" class="md-padding" ng-if="lookingGroup && groupsSelectedTab==='files' && file">
<div flex layout="column">
<pre flex class="wz-pre groupContentViewer wzXmlEditor wz-overflow-y-auto"><code wz-dynamic="file"></code></pre>
<div layout="row" class="wz-padding-bottom-14">
<span flex class="wz-headline-title">{{ filename }}</span>
<button class="md-icon-button" ng-if="lookingGroup" aria-label="Back" tooltip="Close file"
tooltip-placement="left" ng-click="goBackFiles()"><i class="fa fa-fw fa-close"
aria-hidden="true"></i></button>
<!--<span flex class="wz-text-right cursor-pointer color-grey" ng-click="goBackFiles()">close</span>-->
</div>
<div flex layout="column">
<pre flex class="wz-pre groupContentViewer wzXmlEditor wz-overflow-y-auto"><code wz-dynamic="file"></code></pre>
</div>
</div>
</div>
<!-- End File JSON viewer section -->
</div>
<!-- End File JSON viewer section -->
</div>
<div layout="row" class="md-padding" ng-if="addingAgents">
<span ng-show='!multipleSelectorLoading' class="wzMultipleSelectorCounter"><span style='color:green'>+{{currentAdding}}</span>&nbsp;<span
style='color:red'>-{{currentDeleting}}</span></span>
<wz-multiple-selector class='wzMultipleSelector' available-items="availableAgents.data"
selected-items="selectedAgents.data" title-available-items="Available agents"
title-selected-items="Current agents in the group" total-selected-items="totalSelectedAgents"
reload-scroll='reload(element, searchTerm, 499, start)' limit="checkLimit()">
</wz-multiple-selector>
<div layout="row" class="md-padding" ng-if="addingAgents">
<div class='wzMultipleSelector' ng-show="actrl.addingNewAgent">
<div flex="" class="euiCallOut euiCallOut--warning flex euiPage--restrictWidth-custom" style="max-width: 1000px;">
<div class="euiCallOutHeader">
<span class="euiCallOutHeader__title ng-binding">
<react-component name="EuiIcon" props="{type:'help'}"><svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" class="euiIcon euiIcon--medium euiIcon-isLoaded" focusable="false"><defs><path id="help-a" d="M13.6 12.186l-1.357-1.358c-.025-.025-.058-.034-.084-.056.53-.794.84-1.746.84-2.773a4.977 4.977 0 0 0-.84-2.772c.026-.02.059-.03.084-.056L13.6 3.813a6.96 6.96 0 0 1 0 8.373zM8 15A6.956 6.956 0 0 1 3.814 13.6l1.358-1.358c.025-.025.034-.057.055-.084C6.02 12.688 6.974 13 8 13a4.978 4.978 0 0 0 2.773-.84c.02.026.03.058.056.083l1.357 1.358A6.956 6.956 0 0 1 8 15zm-5.601-2.813a6.963 6.963 0 0 1 0-8.373l1.359 1.358c.024.025.057.035.084.056A4.97 4.97 0 0 0 3 8c0 1.027.31 1.98.842 2.773-.027.022-.06.031-.084.056l-1.36 1.358zm5.6-.187A4 4 0 1 1 8 4a4 4 0 0 1 0 8zM8 1c1.573 0 3.019.525 4.187 1.4l-1.357 1.358c-.025.025-.035.057-.056.084A4.979 4.979 0 0 0 8 3a4.979 4.979 0 0 0-2.773.842c-.021-.027-.03-.059-.055-.084L3.814 2.4A6.957 6.957 0 0 1 8 1zm0-1a8.001 8.001 0 1 0 .003 16.002A8.001 8.001 0 0 0 8 0z"></path></defs><use xlink:href="#help-a" fill-rule="evenodd"></use></svg></react-component>
No agents were added to this manager.
</span>
</div>
</div>
<react-component name="RegisterAgent" props="actrl.registerAgentsProps" />
</div>
<div class='wzMultipleSelector' ng-show="!actrl.addingNewAgent">
<span ng-show='!multipleSelectorLoading' class="wzMultipleSelectorCounter"><span style='color:green'>+{{currentAdding}}</span>&nbsp;<span
style='color:red'>-{{currentDeleting}}</span></span>
<wz-multiple-selector class='wzMultipleSelector' available-items="availableAgents.data"
selected-items="selectedAgents.data" title-available-items="Available agents"
title-selected-items="Current agents in the group" total-selected-items="totalSelectedAgents"
reload-scroll='reload(element, searchTerm, 499, start)' limit="checkLimit()">
</wz-multiple-selector>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,3 @@
</div>
</div>
</div>

View File

@ -1,99 +1,116 @@
<md-content flex layout="column" ng-if="octrl.tab === 'fim' && octrl.tabView === 'panels'" ng-class="{'no-opacity': resultState !== 'ready' || !rendered}">
<div ng-controller="agentsPreviewController as actrl">
<div ng-init="actrl.addNewAgent(false)" ng-show="actrl.addingNewAgent">
<react-component name="RegisterAgent" props="actrl.registerAgentsProps" />
</div>
<div ng-show="!actrl.addingNewAgent">
<md-content flex layout="column" ng-if="octrl.tab === 'fim' && octrl.tabView === 'panels'" ng-class="{'no-opacity': resultState !== 'ready' || !rendered}">
<div class="wz-margin-top-10 wz-margin-right-8 wz-margin-left-8 euiCallOut euiCallOut--warning">
<div class="euiCallOutHeader">
<span class="euiCallOutHeader__title ng-binding">
<react-component name="EuiIcon" props="{type:'help'}"><svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" class="euiIcon euiIcon--medium euiIcon-isLoaded" focusable="false"><defs><path id="help-a" d="M13.6 12.186l-1.357-1.358c-.025-.025-.058-.034-.084-.056.53-.794.84-1.746.84-2.773a4.977 4.977 0 0 0-.84-2.772c.026-.02.059-.03.084-.056L13.6 3.813a6.96 6.96 0 0 1 0 8.373zM8 15A6.956 6.956 0 0 1 3.814 13.6l1.358-1.358c.025-.025.034-.057.055-.084C6.02 12.688 6.974 13 8 13a4.978 4.978 0 0 0 2.773-.84c.02.026.03.058.056.083l1.357 1.358A6.956 6.956 0 0 1 8 15zm-5.601-2.813a6.963 6.963 0 0 1 0-8.373l1.359 1.358c.024.025.057.035.084.056A4.97 4.97 0 0 0 3 8c0 1.027.31 1.98.842 2.773-.027.022-.06.031-.084.056l-1.36 1.358zm5.6-.187A4 4 0 1 1 8 4a4 4 0 0 1 0 8zM8 1c1.573 0 3.019.525 4.187 1.4l-1.357 1.358c-.025.025-.035.057-.056.084A4.979 4.979 0 0 0 8 3a4.979 4.979 0 0 0-2.773.842c-.021-.027-.03-.059-.055-.084L3.814 2.4A6.957 6.957 0 0 1 8 1zm0-1a8.001 8.001 0 1 0 .003 16.002A8.001 8.001 0 0 0 8 0z"></path></defs><use xlink:href="#help-a" fill-rule="evenodd"></use></svg></react-component>
No agents were added to this manager:
</span>
<a ng-click="actrl.addNewAgent(true)">
Deploy new agent
</a>
</div>
</div>
<div layout="row" class="height-400">
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[0]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(0)">
<span class="wz-headline-title">Alerts by action over time</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(0)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis id="Wazuh-App-Agents-FIM-Alerts-by-action-over-time" vis-id="'Wazuh-App-Agents-FIM-Alerts-by-action-over-time'"></kbn-vis>
</md-card-content>
</md-card>
</div>
<div layout="row" class="height-300">
<md-card flex="25" class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[1]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(1)">
<span class="wz-headline-title">Top 5 agents</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(1)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis id="Wazuh-App-Overview-FIM-Top-5-agents-pie" vis-id="'Wazuh-App-Overview-FIM-Top-5-agents-pie'"></kbn-vis>
</md-card-content>
</md-card>
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[2]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(2)">
<span class="wz-headline-title">Events summary</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(2)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis id="Wazuh-App-Overview-FIM-Events-summary" vis-id="'Wazuh-App-Overview-FIM-Events-summary'">
</kbn-vis>
</md-card-content>
</md-card>
</div>
<div layout="row" class="height-400">
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[0]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(0)">
<span class="wz-headline-title">Alerts by action over time</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(0)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis id="Wazuh-App-Agents-FIM-Alerts-by-action-over-time" vis-id="'Wazuh-App-Agents-FIM-Alerts-by-action-over-time'"></kbn-vis>
</md-card-content>
</md-card>
</div>
<div layout="row" class="height-300">
<md-card flex="25" class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[1]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(1)">
<span class="wz-headline-title">Top 5 agents</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(1)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis id="Wazuh-App-Overview-FIM-Top-5-agents-pie" vis-id="'Wazuh-App-Overview-FIM-Top-5-agents-pie'"></kbn-vis>
</md-card-content>
</md-card>
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[2]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(2)">
<span class="wz-headline-title">Events summary</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(2)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis id="Wazuh-App-Overview-FIM-Events-summary" vis-id="'Wazuh-App-Overview-FIM-Events-summary'">
</kbn-vis>
</md-card-content>
</md-card>
</div>
<div layout="row" class="height-300">
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[3]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(3)">
<span class="wz-headline-title">Rule distribution</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(3)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis vis-id="'Wazuh-App-Overview-FIM-Top-5-rules'"></kbn-vis>
</md-card-content>
</md-card>
<div layout="row" class="height-300">
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[3]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(3)">
<span class="wz-headline-title">Rule distribution</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(3)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis vis-id="'Wazuh-App-Overview-FIM-Top-5-rules'"></kbn-vis>
</md-card-content>
</md-card>
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[4]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(4)">
<span class="wz-headline-title">Actions</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(4)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis id="Wazuh-App-Overview-FIM-Common-actions" vis-id="'Wazuh-App-Overview-FIM-Common-actions'">
</kbn-vis>
</md-card-content>
</md-card>
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[5]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(5)">
<span class="wz-headline-title">Top 5 users</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(5)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis class="sca-vis table-scrollable" vis-id="'Wazuh-App-Overview-FIM-top-agents-user'"></kbn-vis>
</md-card-content>
</md-card>
</div>
<div layout="row" layout-align="center stretch" class="height-570">
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[6]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(6)">
<span class="wz-headline-title">Alerts summary</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(6)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis vis-id="'Wazuh-App-Overview-FIM-Alerts-summary'"></kbn-vis>
</md-card-content>
</md-card>
</div>
</md-content>
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[4]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(4)">
<span class="wz-headline-title">Actions</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(4)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis id="Wazuh-App-Overview-FIM-Common-actions" vis-id="'Wazuh-App-Overview-FIM-Common-actions'">
</kbn-vis>
</md-card-content>
</md-card>
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[5]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(5)">
<span class="wz-headline-title">Top 5 users</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(5)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis class="sca-vis table-scrollable" vis-id="'Wazuh-App-Overview-FIM-top-agents-user'"></kbn-vis>
</md-card-content>
</md-card>
</div>
<div layout="row" layout-align="center stretch" class="height-570">
<md-card flex class="wz-md-card" ng-class="{'fullscreen': octrl.expandArray[6]}">
<md-card-actions layout="row" class="wz-card-actions-vis" ng-dblclick="octrl.expand(6)">
<span class="wz-headline-title">Alerts summary</span>
<span flex></span>
<span class="cursor-pointer" ng-click="octrl.expand(6)">
<react-component name="EuiIcon" props="{type:'expand'}" />
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis vis-id="'Wazuh-App-Overview-FIM-Alerts-summary'"></kbn-vis>
</md-card-content>
</md-card>
</div>
</md-content>

View File

@ -1,5 +1,5 @@
<md-content flex layout="column" ng-if="octrl.tab === 'general' && octrl.tabView === 'panels'" layout-align="start"
ng-class="{'no-opacity': resultState !== 'ready' || !rendered}">
ng-class="{'no-opacity': resultState !== 'ready' || !rendered}">
<div layout="row" layout-padding>
<react-component flex name="AlertsStats" props="{
@ -123,6 +123,7 @@
</span>
</md-card-actions>
<md-card-content class="wazuh-column">
<kbn-vis id="Wazuh-App-Overview-General-Alerts-evolution-Top-5-agents" vis-id="'Wazuh-App-Overview-General-Alerts-evolution-Top-5-agents'"></kbn-vis>
</md-card-content>
</md-card>

View File

@ -1,80 +1,98 @@
<div flex="auto" layout="column" ng-cloak ng-controller="overviewController as octrl">
<!-- Navigation section -->
<div layout="row" layout-align="start center">
<!-- Breadcrumbs -->
<div layout="row" layout-padding>
<!-- If you're not on the Welcome tab, show a functional breadcrumb -->
<div ng-if="octrl.tab !== 'welcome'">
<span class="wz-text-link cursor-pointer" ng-click="octrl.switchTab('welcome')">Overview</span>
<span> / </span>
<span>{{ octrl.tabNames[octrl.tab] }}</span>
<div ng-controller="agentsPreviewController as actrl">
<div ng-init="actrl.addNewAgent(false)" ng-show="actrl.addingNewAgent">
<react-component name="RegisterAgent" props="actrl.registerAgentsProps" />
</div>
<div ng-show="!actrl.addingNewAgent">
<div flex="auto" layout="column" ng-cloak ng-controller="overviewController as octrl">
<!-- Navigation section -->
<div layout="row" layout-align="start center">
<!-- Breadcrumbs -->
<div layout="row" layout-padding>
<!-- If you're not on the Welcome tab, show a functional breadcrumb -->
<div ng-if="octrl.tab !== 'welcome'">
<span class="wz-text-link cursor-pointer" ng-click="octrl.switchTab('welcome')">Overview</span>
<span> / </span>
<span>{{ octrl.tabNames[octrl.tab] }}</span>
</div>
</div>
<!-- End breadcrumbs -->
<!-- Separator -->
<span flex></span>
<!-- End separator -->
<!-- Reporting button section -->
<div ng-if="octrl.tab !== 'welcome' && octrl.tabView === 'panels'">
<!-- Report button -->
<button class="kuiButton kuiButton--secondary wz-margin-right-8 small" tooltip="Generate report"
tooltip-placement="bottom"
ng-class="{'euiButtonEmpty--disabled': !rendered || loading || resultState !== 'ready'}"
ng-disabled="!rendered || loading || resultState !== 'ready'" ng-click="octrl.startVis2Png()"
aria-label="Generate report button">
<i class="fa fa-fw fa-print" aria-hidden="true"></i>
</button>
</div>
<!-- End Reporting buttons section -->
<!-- Discover/Dashboard buttons section -->
<div ng-if="octrl.tab !== 'welcome'" class="wz-margin-right-8">
<!-- Dashboard button -->
<button class="kuiButton kuiButton--secondary small"
ng-click="octrl.tabView === 'discover' ? octrl.switchSubtab('panels') : octrl.switchSubtab('discover')"
aria-label="Dashboard button">
<span ng-if="octrl.tabView === 'discover'"><i class="fa fa-fw fa-th" aria-hidden="true"></i>
Dashboard</span>
<span ng-if="octrl.tabView === 'panels'"><i class="fa fa-fw fa-compass" aria-hidden="true"></i>
Discover</span>
</button>
</div>
<!-- End Discover/Dashboard buttons section -->
</div>
</div>
<!-- End breadcrumbs -->
<!-- End navigation section -->
<!-- Separator -->
<span flex></span>
<!-- End separator -->
<!-- Navigation bar -->
<div ng-if="octrl.overviewTabsProps">
<react-component name="Tabs" props="octrl.overviewTabsProps" />
</div>
<!-- End of navigation bar -->
<!-- Reporting button section -->
<div ng-if="octrl.tab !== 'welcome' && octrl.tabView === 'panels'">
<!-- Report button -->
<button class="kuiButton kuiButton--secondary wz-margin-right-8 small" tooltip="Generate report"
tooltip-placement="bottom"
ng-class="{'euiButtonEmpty--disabled': !rendered || loading || resultState !== 'ready'}"
ng-disabled="!rendered || loading || resultState !== 'ready'" ng-click="octrl.startVis2Png()"
aria-label="Generate report button">
<i class="fa fa-fw fa-print" aria-hidden="true"></i>
</button>
</div>
<!-- End Reporting buttons section -->
<!-- Discover search bar section -->
<kbn-dis ng-show="octrl.tab !== 'welcome'"></kbn-dis>
<!-- End Discover search bar section -->
<!-- Discover/Dashboard buttons section -->
<div ng-if="octrl.tab !== 'welcome'" class="wz-margin-right-8">
<!-- Dashboard button -->
<button class="kuiButton kuiButton--secondary small"
ng-click="octrl.tabView === 'discover' ? octrl.switchSubtab('panels') : octrl.switchSubtab('discover')"
aria-label="Dashboard button">
<span ng-if="octrl.tabView === 'discover'"><i class="fa fa-fw fa-th" aria-hidden="true"></i>
Dashboard</span>
<span ng-if="octrl.tabView === 'panels'"><i class="fa fa-fw fa-compass" aria-hidden="true"></i>
Discover</span>
</button>
</div>
<!-- End Discover/Dashboard buttons section -->
</div>
<!-- End navigation section -->
<!-- Loading status section -->
<div layout="column" layout-align="center center"
ng-if="octrl.tab !== 'welcome' && octrl.tabView === 'panels' && !rendered && resultState !== 'none'">
<div class="percentage"><i class="fa fa-fw fa-spin fa-spinner" aria-hidden="true"></i></div>
<div class="percentage">{{loadingStatus}}</div>
</div>
<!-- End loading status section -->
<!-- Navigation bar -->
<div ng-if="octrl.overviewTabsProps">
<react-component name="Tabs" props="octrl.overviewTabsProps" />
</div>
<!-- End of navigation bar -->
<!-- Report status section -->
<div layout="column" layout-align="center center" ng-if="octrl.tab !== 'welcome'"
ng-show="reportBusy && reportStatus">
<div class="percentage"><i class="fa fa-fw fa-spin fa-spinner" aria-hidden="true"></i></div>
<div class="percentage">{{reportStatus}}</div>
</div>
<!-- End report status section -->
<!-- Discover search bar section -->
<kbn-dis ng-show="octrl.tab !== 'welcome'"></kbn-dis>
<!-- End Discover search bar section -->
<!-- No results section -->
<div layout="row" class="wz-margin-top-10 wz-margin-right-8 wz-margin-left-8" ng-if="octrl.tab !== 'welcome'"
ng-show="resultState === 'none' && octrl.tabView === 'panels'">
<react-component flex name="EuiCallOut" props="{color:'warning',iconType:'help', title:'There are no results for selected time range. Try another
one.'}" />
</div>
<!-- Loading status section -->
<div layout="column" layout-align="center center"
ng-if="octrl.tab !== 'welcome' && octrl.tabView === 'panels' && !rendered && resultState !== 'none'">
<div class="percentage"><i class="fa fa-fw fa-spin fa-spinner" aria-hidden="true"></i></div>
<div class="percentage">{{loadingStatus}}</div>
</div>
<!-- End loading status section -->
<!-- Report status section -->
<div layout="column" layout-align="center center" ng-if="octrl.tab !== 'welcome'"
ng-show="reportBusy && reportStatus">
<div class="percentage"><i class="fa fa-fw fa-spin fa-spinner" aria-hidden="true"></i></div>
<div class="percentage">{{reportStatus}}</div>
</div>
<!-- End report status section -->
<!-- No results section -->
<div layout="row" class="wz-margin-top-10 wz-margin-right-8 wz-margin-left-8" ng-if="octrl.tab !== 'welcome'"
ng-show="resultState === 'none' && octrl.tabView === 'panels'">
<react-component flex name="EuiCallOut" props="{color:'warning',iconType:'help', title:'There are no results for selected time range. Try another
one.'}" />
</div>
<!-- No results section -->
<div ng-if="!actrl.hasAgents" class="wz-margin-top-10 wz-margin-right-8 wz-margin-left-8 euiCallOut euiCallOut--warning">
<div class="euiCallOutHeader">
<span class="euiCallOutHeader__title ng-binding">
<react-component name="EuiIcon" props="{type:'help'}"><svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" class="euiIcon euiIcon--medium euiIcon-isLoaded" focusable="false"><defs><path id="help-a" d="M13.6 12.186l-1.357-1.358c-.025-.025-.058-.034-.084-.056.53-.794.84-1.746.84-2.773a4.977 4.977 0 0 0-.84-2.772c.026-.02.059-.03.084-.056L13.6 3.813a6.96 6.96 0 0 1 0 8.373zM8 15A6.956 6.956 0 0 1 3.814 13.6l1.358-1.358c.025-.025.034-.057.055-.084C6.02 12.688 6.974 13 8 13a4.978 4.978 0 0 0 2.773-.84c.02.026.03.058.056.083l1.357 1.358A6.956 6.956 0 0 1 8 15zm-5.601-2.813a6.963 6.963 0 0 1 0-8.373l1.359 1.358c.024.025.057.035.084.056A4.97 4.97 0 0 0 3 8c0 1.027.31 1.98.842 2.773-.027.022-.06.031-.084.056l-1.36 1.358zm5.6-.187A4 4 0 1 1 8 4a4 4 0 0 1 0 8zM8 1c1.573 0 3.019.525 4.187 1.4l-1.357 1.358c-.025.025-.035.057-.056.084A4.979 4.979 0 0 0 8 3a4.979 4.979 0 0 0-2.773.842c-.021-.027-.03-.059-.055-.084L3.814 2.4A6.957 6.957 0 0 1 8 1zm0-1a8.001 8.001 0 1 0 .003 16.002A8.001 8.001 0 0 0 8 0z"></path></defs><use xlink:href="#help-a" fill-rule="evenodd"></use></svg></react-component>
No agents were added to this manager:
</span>
<a ng-click="actrl.addNewAgent(true)">
Deploy new agent
</a>
</div>
</div>
<!-- No results section -->

View File

@ -15,4 +15,4 @@ include ./overview-aws.html
include ./overview-virustotal.html
include ./overview-osquery.html
include ./overview-docker.html
include ../footer.foot
include ./footer.foot