net-mgmt/zabbix-agent: add Zabbix Agent to plugins

This commit is contained in:
Frank Wall 2017-03-22 17:02:39 +01:00
parent a3520c7c24
commit ee0bb8ea6d
17 changed files with 1196 additions and 0 deletions

View file

@ -0,0 +1,7 @@
PLUGIN_NAME= zabbix-agent
PLUGIN_VERSION= 0.1
PLUGIN_COMMENT= Enterprise-class open source distributed monitoring agent
PLUGIN_DEPENDS= zabbix32-agent
PLUGIN_MAINTAINER= opnsense@moov.de
.include "../../Mk/plugins.mk"

View file

@ -0,0 +1,89 @@
<?php
/**
* Copyright (C) 2017 Frank Wall
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
function zabbixagent_enabled()
{
global $config;
return isset($config['OPNsense']['ZabbixAgent']['settings']['main']['enabled']) &&
$config['OPNsense']['ZabbixAgent']['settings']['main']['enabled'] == 1;
}
function zabbixagent_firewall($fw)
{
if (!zabbixagent_enabled()) {
return;
}
$fw->registerAnchor('zabbix-agent/*', 'nat');
$fw->registerAnchor('zabbix-agent/*', 'rdr');
$fw->registerAnchor('zabbix-agent/*', 'fw');
}
/**
* register legacy service
* @return array
*/
function zabbixagent_services()
{
$services = array();
if (!zabbixagent_enabled()) {
return $services;
}
$services[] = array(
'description' => gettext('Enterprise-class open source distributed monitoring agent'),
'pidfile' => '/var/run/zabbix/zabbix_agentd.pid',
'configd' => array(
'restart' => array('zabbix_agentd restart'),
'start' => array('zabbix_agentd start'),
'stop' => array('zabbix_agentd stop'),
),
'name' => 'zabbix_agentd',
);
return $services;
}
/**
* sync configuration via xmlrpc
* @return array
*/
/**
XXX: needs investigation, hostname must be unique/replaced/excluded on secondary node(s)
function zabbixagent_xmlrpc_sync()
{
$result = array();
$result['id'] = 'zabbixagent';
$result['section'] = 'OPNsense.zabbixagent';
$result['description'] = gettext('Enterprise-class open source distributed monitoring agent');
return array($result);
}
*/

View file

@ -0,0 +1,153 @@
<?php
/**
* Copyright (C) 2017 Frank Wall
* Copyright (C) 2015 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
namespace OPNsense\ZabbixAgent\Api;
use \OPNsense\Base\ApiControllerBase;
use \OPNsense\Core\Backend;
use \OPNsense\ZabbixAgent\ZabbixAgent;
/**
* Class ServiceController
* @package OPNsense\ZabbixAgent
*/
class ServiceController extends ApiControllerBase
{
/**
* start zabbix agent service (in background)
* @return array
*/
public function startAction()
{
if ($this->request->isPost()) {
$backend = new Backend();
$response = $backend->configdRun("zabbixagent start", true);
return array("response" => $response);
} else {
return array("response" => array());
}
}
/**
* stop zabbix agent service
* @return array
*/
public function stopAction()
{
if ($this->request->isPost()) {
$backend = new Backend();
$response = $backend->configdRun("zabbixagent stop");
return array("response" => $response);
} else {
return array("response" => array());
}
}
/**
* restart zabbix agent service
* @return array
*/
public function restartAction()
{
if ($this->request->isPost()) {
$backend = new Backend();
$response = $backend->configdRun("zabbixagent restart");
return array("response" => $response);
} else {
return array("response" => array());
}
}
/**
* retrieve status of zabbix agent service
* @return array
* @throws \Exception
*/
public function statusAction()
{
$backend = new Backend();
$mdlAgent = new ZabbixAgent();
$response = $backend->configdRun("zabbixagent status");
if (strpos($response, "not running") > 0) {
if ($mdlAgent->settings->main->enabled->__toString() == 1) {
$status = "stopped";
} else {
$status = "disabled";
}
} elseif (strpos($response, "is running") > 0) {
$status = "running";
} elseif ($mdlAgent->settings->main->enabled->__toString() == 0) {
$status = "disabled";
} else {
$status = "unkown";
}
return array("status" => $status);
}
/**
* reconfigure zabbix agent, generate config and reload
*/
public function reconfigureAction()
{
if ($this->request->isPost()) {
$force_restart = false;
// close session for long running action
$this->sessionClose();
$mdlAgent = new ZabbixAgent();
$backend = new Backend();
$runStatus = $this->statusAction();
// stop zabbix agent when disabled
if ($runStatus['status'] == "running" &&
($mdlAgent->settings->main->enabled->__toString() == 0 || $force_restart)) {
$this->stopAction();
}
// generate template
$backend->configdRun('template reload OPNsense/ZabbixAgent');
// (res)start daemon
if ($mdlAgent->settings->main->enabled->__toString() == 1) {
if ($runStatus['status'] == "running" && !$force_restart) {
$backend->configdRun("zabbixagent reconfigure");
} else {
$this->startAction();
}
}
return array("status" => "ok");
} else {
return array("status" => "failed");
}
}
}

View file

@ -0,0 +1,45 @@
<?php
/**
* Copyright (C) 2017 Frank Wall
* Copyright (C) 2015 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
namespace OPNsense\ZabbixAgent\Api;
use \OPNsense\Base\ApiMutableModelControllerBase;
use \OPNsense\Base\UIModelGrid;
use \OPNsense\Core\Config;
use \OPNsense\ZabbixAgent\ZabbixAgent;
/**
* Class SettingsController
* @package OPNsense\ZabbixAgent
*/
class SettingsController extends ApiMutableModelControllerBase
{
static protected $internalModelName = 'zabbixagent';
static protected $internalModelClass = '\OPNsense\ZabbixAgent\ZabbixAgent';
}

View file

@ -0,0 +1,51 @@
<?php
/**
* Copyright (C) 2017 Frank Wall
* Copyright (C) 2015 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
namespace OPNsense\ZabbixAgent;
/**
* Class IndexController
* @package OPNsense\ZabbixAgent
*/
class IndexController extends \OPNsense\Base\IndexController
{
/**
* zabbix agent index page
* @throws \Exception
*/
public function indexAction()
{
// set page title
$this->view->title = "Zabbix Agent Settings";
// include form definitions
$this->view->settingsForm = $this->getForm("settings");
// pick the template to serve
$this->view->pick('OPNsense/ZabbixAgent/index');
}
}

View file

@ -0,0 +1,129 @@
<form>
<tab id="zabbixagent-settings-main" description="Main Settings">
<field>
<id>zabbixagent.settings.main.enabled</id>
<label>Enabled</label>
<type>checkbox</type>
<help><![CDATA[Enable Zabbix Agent service.]]></help>
</field>
<field>
<id>zabbixagent.settings.main.hostname</id>
<label>Hostname</label>
<type>text</type>
<help><![CDATA[Usually the FQDN. Required for active checks and must match hostname as configured on the Zabbix server.]]></help>
</field>
<field>
<id>zabbixagent.settings.main.listenPort</id>
<label>Listen Port</label>
<type>text</type>
<help><![CDATA[Zabbix agent will listen on this port for connections from the server.]]></help>
</field>
<field>
<id>zabbixagent.settings.main.listenIP</id>
<label>Listen IPs</label>
<type>select_multiple</type>
<style>tokenize</style>
<allownew>true</allownew>
<help><![CDATA[List of IP addresses that the agent should listen on. First IP address is sent to Zabbix server if connecting to it to retrieve list of active checks.]]></help>
</field>
<field>
<id>zabbixagent.settings.main.sourceIP</id>
<label>Source IP</label>
<type>text</type>
<help><![CDATA[Source IP address for outgoing connections.]]></help>
</field>
<field>
<id>zabbixagent.settings.main.serverList</id>
<label>Zabbix Servers</label>
<type>select_multiple</type>
<style>tokenize</style>
<allownew>true</allownew>
<help><![CDATA[List of IP addresses (or hostnames) of Zabbix servers. Incoming connections will be accepted only from the hosts listed here.]]></help>
</field>
<field>
<id>zabbixagent.settings.main.logFileSize</id>
<label>Log File Size</label>
<type>text</type>
<help><![CDATA[Maximum size of log file in MB. Zabbix Agent will automatically rotate the log once this limit is reached.]]></help>
<advanced>true</advanced>
</field>
<field>
<id>zabbixagent.settings.main.debugLevel</id>
<label>Debug Level</label>
<type>dropdown</type>
<help><![CDATA[Specifies the debug level for Zabbix agent.]]></help>
<advanced>false</advanced>
</field>
</tab>
<tab id="zabbixagent-settings-tuning" description="Tuning Parameters">
<field>
<id>zabbixagent.settings.tuning.startAgents</id>
<label>Pre-Forked Instances</label>
<type>text</type>
<help><![CDATA[Number of pre-forked instances of zabbix_agentd that process passive checks. If set to 0, disables passive checks and the agent will not listen on any TCP port.]]></help>
</field>
<field>
<id>zabbixagent.settings.tuning.bufferSend</id>
<label>BufferSend</label>
<type>text</type>
<help><![CDATA[Do not keep data longer than N seconds in buffer.]]></help>
<advanced>true</advanced>
</field>
<field>
<id>zabbixagent.settings.tuning.bufferSize</id>
<label>BufferSize</label>
<type>text</type>
<help><![CDATA[Maximum number of values in a memory buffer. The agent will send all collected data to Zabbix Server or Proxy if the buffer is full.]]></help>
<advanced>true</advanced>
</field>
<field>
<id>zabbixagent.settings.tuning.maxLinesPerSecond</id>
<label>MaxLinesPerSecond</label>
<type>text</type>
<help><![CDATA[Maximum number of new lines the agent will send per second to Zabbix Server or Proxy processing 'log' and 'logrt' active checks.]]></help>
<advanced>true</advanced>
</field>
<field>
<id>zabbixagent.settings.tuning.timeout</id>
<label>Processing Timeout</label>
<type>text</type>
<help><![CDATA[]]>Spend no more than N seconds on processing.</help>
<advanced>false</advanced>
</field>
</tab>
<tab id="zabbixagent-settings-features" description="Zabbix Features">
<field>
<id>zabbixagent.settings.features.enableActiveChecks</id>
<label>Enable Active Checks</label>
<type>checkbox</type>
<help><![CDATA[Enable active checks.]]></help>
</field>
<field>
<id>zabbixagent.settings.features.activeCheckServers</id>
<label>Active Check Servers</label>
<type>select_multiple</type>
<style>tokenize</style>
<allownew>true</allownew>
<help><![CDATA[List of IP:port (or hostname:port) pairs of Zabbix servers for active checks. If port is not specified, default port is used. IPv6 addresses must be enclosed in square brackets if port for that host is specified. If port is not specified, square brackets for IPv6 addresses are optional. If this parameter is not specified, active checks are disabled. Example: ServerActive=127.0.0.1:20051,zabbix.domain,[::1]:30051,::1,[12fc::1]]]></help>
</field>
<field>
<id>zabbixagent.settings.features.refreshActiveChecks</id>
<label>Active Check Refresh</label>
<type>text</type>
<help><![CDATA[How often list of active checks is refreshed, in seconds.]]></help>
</field>
<field>
<id>zabbixagent.settings.features.enableRemoteCommands</id>
<label>Enable Remote Commands</label>
<type>checkbox</type>
<help><![CDATA[Whether remote commands from Zabbix server are allowed.]]></help>
</field>
<field>
<id>zabbixagent.settings.features.logRemoteCommands</id>
<label>Log Remote Commands</label>
<type>checkbox</type>
<help><![CDATA[Enable logging of executed shell commands as warnings. Make sure to set the Debug Level accordingly.]]></help>
</field>
</tab>
<activetab>zabbixagent-settings-main</activetab>
</form>

View file

@ -0,0 +1,10 @@
<acl>
<page-services-zabbixagent>
<name>Services: Zabbix Agent</name>
<patterns>
<pattern>ui/zabbixagent/*</pattern>
<pattern>api/zabbixagent/*</pattern>
<pattern>diag_logs_zabbixagent.php</pattern>
</patterns>
</page-services-zabbixagent>
</acl>

View file

@ -0,0 +1,12 @@
<menu>
<Services>
<ZabbixAgent VisibleName="Zabbix Agent" cssClass="fa fa-certificate fa-fw">
<Settings order="10" url="/ui/zabbixagent/">
<MainSettings VisibleName="Main Settings" url="/ui/zabbixagent/#subtab_zabbixagent-settings-main"/>
<Features VisibleName="Features" url="/ui/zabbixagent/#subtab_zabbixagent-settings-features"/>
<Tuning VisibleName="Tuning Parameters" url="/ui/zabbixagent/#subtab_zabbixagent-settings-features"/>
</Settings>
<Log VisibleName="Log File" order="50" url="/diag_logs_zabbixagent.php"/>
</ZabbixAgent>
</Services>
</menu>

View file

@ -0,0 +1,52 @@
<?php
/**
* Copyright (C) 2017 Frank Wall
* Copyright (C) 2015 Deciso B.V.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
namespace OPNsense\ZabbixAgent;
use OPNsense\Base\BaseModel;
use OPNsense\Core\Backend;
/**
* Class ZabbixAgent
* @package OPNsense\ZabbixAgent
*/
class ZabbixAgent extends BaseModel
{
/**
* check if module is enabled
* @return bool is the ZabbixAgent service enabled
*/
public function isEnabled()
{
if ((string)$this->settings->main->enabled === "1") {
return true;
}
return false;
}
}

View file

@ -0,0 +1,130 @@
<model>
<mount>//OPNsense/ZabbixAgent</mount>
<version>1.0.0</version>
<description>
Enterprise-class open source distributed monitoring agent
</description>
<items>
<settings>
<main>
<enabled type="BooleanField">
<default>0</default>
<Required>Y</Required>
</enabled>
<hostname type="TextField">
<Required>Y</Required>
<mask>/^.{1,255}$/u</mask>
<ValidationMessage>Should be a string between 1 and 255 characters.</ValidationMessage>
</hostname>
<serverList type="CSVListField">
<Required>Y</Required>
<multiple>Y</multiple>
<mask>/^([a-zA-Z0-9\.:\[\]\s\-]*?,)*([a-zA-Z0-9\.:\[\]\s\-]*)$/</mask>
<ChangeCase>lower</ChangeCase>
<ValidationMessage>Please provide valid Zabbix server addresses, i.e. 10.0.0.1 or zabbix.example.com.</ValidationMessage>
</serverList>
<listenPort type="IntegerField">
<default>10050</default>
<MinimumValue>1024</MinimumValue>
<MaximumValue>65535</MaximumValue>
<Required>Y</Required>
</listenPort>
<listenIP type="CSVListField">
<Required>Y</Required>
<multiple>Y</multiple>
<mask>/^((([0-9a-zA-Z._\-]+:[0-9a-zA-Z._\-]+)([,]){0,1}))*/u</mask>
<ChangeCase>lower</ChangeCase>
<ValidationMessage>Please provide valid IP addresses, i.e. 10.0.0.1.</ValidationMessage>
</listenIP>
<sourceIP type="TextField">
<Required>N</Required>
<mask>/^.{1,255}$/u</mask>
<ValidationMessage>Should be a string between 1 and 255 characters.</ValidationMessage>
</sourceIP>
<logFileSize type="IntegerField">
<default>100</default>
<MinimumValue>1</MinimumValue>
<MaximumValue>5000</MaximumValue>
<Required>Y</Required>
</logFileSize>
<debugLevel type="OptionField">
<default>val_3</default>
<OptionValues>
<val_0>0 - basic information</val_0>
<val_1>1 - critical information</val_1>
<val_2>2 - error information</val_2>
<val_3>3 - warnings [default]</val_3>
<val_4>4 - debugging</val_4>
<val_5>5 - extended debugging</val_5>
</OptionValues>
<Required>Y</Required>
</debugLevel>
</main>
<tuning>
<startAgents type="IntegerField">
<default>3</default>
<MinimumValue>0</MinimumValue>
<MaximumValue>20</MaximumValue>
<Required>Y</Required>
<ValidationMessage>Should be a number between 0 and 20.</ValidationMessage>
</startAgents>
<bufferSend type="IntegerField">
<default>5</default>
<MinimumValue>1</MinimumValue>
<MaximumValue>3600</MaximumValue>
<Required>Y</Required>
<ValidationMessage>Should be a number between 1 and 3600.</ValidationMessage>
</bufferSend>
<bufferSize type="IntegerField">
<default>100</default>
<MinimumValue>1</MinimumValue>
<MaximumValue>10000</MaximumValue>
<Required>Y</Required>
<ValidationMessage>Should be a number between 1 and 10000.</ValidationMessage>
</bufferSize>
<maxLinesPerSecond type="IntegerField">
<default>100</default>
<MinimumValue>1</MinimumValue>
<MaximumValue>10000</MaximumValue>
<Required>Y</Required>
<ValidationMessage>Should be a number between 1 and 10000.</ValidationMessage>
</maxLinesPerSecond>
<timeout type="IntegerField">
<default>3</default>
<MinimumValue>1</MinimumValue>
<MaximumValue>30</MaximumValue>
<Required>Y</Required>
<ValidationMessage>Should be a number between 1 and 30.</ValidationMessage>
</timeout>
</tuning>
<features>
<enableActiveChecks type="BooleanField">
<default>1</default>
<Required>Y</Required>
</enableActiveChecks>
<activeCheckServers type="CSVListField">
<Required>N</Required>
<multiple>Y</multiple>
<mask>/^([a-zA-Z0-9\.:\[\]\s\-]*?,)*([a-zA-Z0-9\.:\[\]\s\-]*)$/</mask>
<ChangeCase>lower</ChangeCase>
<ValidationMessage>Please provide valid active check receivers, i.e. 10.0.0.1:10051, zabbix.example.com or [::1]:30051.</ValidationMessage>
</activeCheckServers>
<refreshActiveChecks type="IntegerField">
<default>120</default>
<MinimumValue>10</MinimumValue>
<MaximumValue>3600</MaximumValue>
<Required>Y</Required>
<ValidationMessage>Should be a number between 10 and 3600.</ValidationMessage>
</refreshActiveChecks>
<enableRemoteCommands type="BooleanField">
<default>0</default>
<Required>Y</Required>
</enableRemoteCommands>
<logRemoteCommands type="BooleanField">
<default>0</default>
<Required>Y</Required>
</logRemoteCommands>
</features>
</settings>
</items>
</model>

View file

@ -0,0 +1,149 @@
{#
Copyright (C) 2017 Frank Wall
OPNsense® is Copyright © 2014 2015 by Deciso B.V.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
#}
<script type="text/javascript">
$( document ).ready(function() {
var data_get_map = {'frm_zabbixagent':"/api/zabbixagent/settings/get"};
// load initial data
mapDataToFormUI(data_get_map).done(function(){
formatTokenizersUI();
$('.selectpicker').selectpicker('refresh');
// request service status on load and update status box
ajaxCall(url="/api/zabbixagent/service/status", sendData={}, callback=function(data,status) {
updateServiceStatusUI(data['status']);
});
});
/***********************************************************************
* Commands
**********************************************************************/
// form save event handlers for all defined forms
$('[id*="save_"]').each(function(){
$(this).click(function(){
var frm_id = $(this).closest("form").attr("id");
var frm_title = $(this).closest("form").attr("data-title");
// save data for tab
saveFormToEndpoint(url="/api/zabbixagent/settings/set",formid=frm_id,callback_ok=function(){
// set progress animation when reloading
$("#"+frm_id+"_progress").addClass("fa fa-spinner fa-pulse");
// on correct save, perform restart
ajaxCall(url="/api/zabbixagent/service/reconfigure", sendData={}, callback=function(data,status){
// when done, disable progress animation.
$("#"+frm_id+"_progress").removeClass("fa fa-spinner fa-pulse");
if (status != "success" || data['status'] != 'ok' ) {
// fix error handling
BootstrapDialog.show({
type:BootstrapDialog.TYPE_WARNING,
title: frm_title,
message: JSON.stringify(data),
draggable: true
});
} else {
// request service status after successful save and update status box (wait a few seconds before update)
setTimeout(function(){
ajaxCall(url="/api/zabbixagent/service/status", sendData={}, callback=function(data,status) {
updateServiceStatusUI(data['status']);
});
},3000);
}
});
});
});
});
// update history on tab state and implement navigation
if(window.location.hash != "") {
$('a[href="' + window.location.hash + '"]').click()
}
$('.nav-tabs a').on('shown.bs.tab', function (e) {
history.pushState(null, null, e.target.hash);
});
});
</script>
<ul class="nav nav-tabs" role="tablist" id="maintabs">
{% for tab in settingsForm['tabs']|default([]) %}
{% if tab['subtabs']|default(false) %}
{# Tab with dropdown #}
{# Find active subtab #}
{% set active_subtab="" %}
{% for subtab in tab['subtabs']|default({}) %}
{% if subtab[0]==settingsForm['activetab']|default("") %}
{% set active_subtab=subtab[0] %}
{% endif %}
{% endfor %}
<li role="presentation" class="dropdown {% if settingsForm['activetab']|default("") == active_subtab %}active{% endif %}">
<a data-toggle="dropdown" href="#" class="dropdown-toggle pull-right visible-lg-inline-block visible-md-inline-block visible-xs-inline-block visible-sm-inline-block" role="button" style="border-left: 1px dashed lightgray;">
<b><span class="caret"></span></b>
</a>
<a data-toggle="tab" href="#subtab_{{tab['subtabs'][0][0]}}" class="visible-lg-inline-block visible-md-inline-block visible-xs-inline-block visible-sm-inline-block" style="border-right:0px;"><b>{{tab[1]}}</b></a>
<ul class="dropdown-menu" role="menu">
{% for subtab in tab['subtabs']|default({})%}
<li class="{% if settingsForm['activetab']|default("") == subtab[0] %}active{% endif %}"><a data-toggle="tab" href="#subtab_{{subtab[0]}}"><i class="fa fa-check-square"></i> {{subtab[1]}}</a></li>
{% endfor %}
</ul>
</li>
{% else %}
{# Standard Tab #}
<li {% if settingsForm['activetab']|default("") == tab[0] %} class="active" {% endif %}>
<a data-toggle="tab" href="#tab_{{tab[0]}}">
<b>{{tab[1]}}</b>
</a>
</li>
{% endif %}
{% endfor %}
</ul>
<div class="content-box tab-content">
{% for tab in settingsForm['tabs']|default([]) %}
{% if tab['subtabs']|default(false) %}
{# Tab with dropdown #}
{% for subtab in tab['subtabs']|default({})%}
<div id="subtab_{{subtab[0]}}" class="tab-pane fade{% if settingsForm['activetab']|default("") == subtab[0] %} in active {% endif %}">
{{ partial("layout_partials/base_form",['fields':subtab[2],'id':'frm_'~subtab[0],'data_title':subtab[1],'apply_btn_id':'save_'~subtab[0]])}}
</div>
{% endfor %}
{% endif %}
{% if tab['subtabs']|default(false)==false %}
<div id="tab_{{tab[0]}}" class="tab-pane fade{% if settingsForm['activetab']|default("") == tab[0] %} in active {% endif %}">
{{ partial("layout_partials/base_form",['fields':tab[2],'id':'frm_'~tab[0],'apply_btn_id':'save_'~tab[0]])}}
</div>
{% endif %}
{% endfor %}
</div>

View file

@ -0,0 +1,11 @@
#!/bin/sh
AGENT_DIRS="/var/run/zabbix /var/log/zabbix /usr/local/etc/zabbix_agentd.d"
for directory in ${AGENT_DIRS}; do
mkdir -p ${directory}
chown -R zabbix:zabbix ${directory}
chmod -R 770 ${directory}
done
exit 0

View file

@ -0,0 +1,34 @@
[setup]
command:/usr/local/opnsense/scripts/OPNsense/ZabbixAgent/setup.sh
parameters:
type:script_output
[start]
command:/usr/local/opnsense/scripts/OPNsense/ZabbixAgent/setup.sh; /usr/local/etc/rc.d/zabbix_agentd start
parameters:
type:script
message:starting zabbix_agentd
[stop]
command:/usr/local/etc/rc.d/zabbix_agentd stop; /usr/bin/killall zabbix_agentd; exit 0
parameters:
type:script
message:stopping zabbix_agentd
[restart]
command:/usr/local/opnsense/scripts/OPNsense/ZabbixAgent/setup.sh; /usr/local/etc/rc.d/zabbix_agentd restart
parameters:
type:script
message:restarting zabbix_agentd
[status]
command:/usr/local/etc/rc.d/zabbix_agentd status || exit 0
parameters:
type:script_output
message:requesting zabbix_agentd status
[reconfigure]
command:/usr/local/opnsense/scripts/OPNsense/ZabbixAgent/setup.sh; /usr/local/etc/rc.d/zabbix_agentd restart
parameters:
type:script
message:reconfiguring zabbix_agentd

View file

@ -0,0 +1,2 @@
zabbix_agentd.conf:/usr/local/etc/zabbix_agentd.conf
rc.conf.d:/etc/rc.conf.d/zabbix_agentd

View file

@ -0,0 +1,6 @@
{% if helpers.exists('OPNsense.ZabbixAgent.settings.main.enabled') and OPNsense.ZabbixAgent.settings.main.enabled|default("0") == "1" %}
zabbix_agentd_enable=YES
{% else %}
zabbix_agentd_enable=NO
{% endif %}
zabbix_agentd_config=/usr/local/etc/zabbix_agentd.conf

View file

@ -0,0 +1,310 @@
#
# Automatically generated configuration.
# Do not edit this file manually.
{% if helpers.exists('OPNsense.ZabbixAgent.settings') %}
# This is a config file for zabbix agent (unix)
# to get more information about zabbix, visit http://www.zabbix.com
############ GENERAL PARAMETERS #################
### Option: PidFile
# Name of PID file.
#
PidFile=/var/run/zabbix/zabbix_agentd.pid
### Option: LogType
# Specifies where log messages are written to:
# system - syslog
# file - file specified with LogFile parameter
# console - standard output
#
LogType=file
### Option: LogFile
# Log file name for LogType 'file' parameter.
#
LogFile=/var/log/zabbix/zabbix_agentd.log
### Option: LogFileSize
# Maximum size of log file in MB.
# 0 - disable automatic log rotation.
#
LogFileSize={{OPNsense.ZabbixAgent.settings.main.logFileSize}}
### Option: DebugLevel
# Specifies debug level
# 0 - basic information about starting and stopping of Zabbix processes
# 1 - critical information
# 2 - error information
# 3 - warnings
# 4 - for debugging (produces lots of information)
# 5 - extended debugging (produces even more information)
DebugLevel={{OPNsense.ZabbixAgent.settings.main.debugLevel|replace("val_", "")}}
### Option: SourceIP
# Source IP address for outgoing connections.
#
{% if helpers.exists('OPNsense.ZabbixAgent.settings.main.sourceIP') %}
SourceIP={{OPNsense.ZabbixAgent.settings.main.sourceIP}}
{% endif %}
### Option: EnableRemoteCommands
# Whether remote commands from Zabbix server are allowed.
# 0 - not allowed
# 1 - allowed
#
EnableRemoteCommands={{OPNsense.ZabbixAgent.settings.features.enableRemoteCommands}}
### Option: LogRemoteCommands
# Enable logging of executed shell commands as warnings.
# 0 - disabled
# 1 - enabled
#
LogRemoteCommands={{OPNsense.ZabbixAgent.settings.features.logRemoteCommands}}
##### Passive checks related
### Option: Server
# List of comma delimited IP addresses (or hostnames) of Zabbix servers.
# Incoming connections will be accepted only from the hosts listed here.
# If IPv6 support is enabled then '127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1' are treated equally.
#
Server={{OPNsense.ZabbixAgent.settings.main.serverList}}
### Option: ListenPort
# Agent will listen on this port for connections from the server.
#
ListenPort={{OPNsense.ZabbixAgent.settings.main.listenPort}}
### Option: ListenIP
# List of comma delimited IP addresses that the agent should listen on.
# First IP address is sent to Zabbix server if connecting to it to retrieve list of active checks.
#
ListenIP={{OPNsense.ZabbixAgent.settings.main.listenIP}}
### Option: StartAgents
# Number of pre-forked instances of zabbix_agentd that process passive checks.
# If set to 0, disables passive checks and the agent will not listen on any TCP port.
#
StartAgents={{OPNsense.ZabbixAgent.settings.tuning.startAgents}}
##### Active checks related
### Option: ServerActive
# List of comma delimited IP:port (or hostname:port) pairs of Zabbix servers for active checks.
# If port is not specified, default port is used.
# IPv6 addresses must be enclosed in square brackets if port for that host is specified.
# If port is not specified, square brackets for IPv6 addresses are optional.
# If this parameter is not specified, active checks are disabled.
# Example: ServerActive=127.0.0.1:20051,zabbix.domain,[::1]:30051,::1,[12fc::1]
#
{% if OPNsense.ZabbixAgent.settings.features.enableActiveChecks == '1' and OPNsense.ZabbixAgent.settings.features.activeCheckServers|default("") != "" %}
ServerActive={{OPNsense.ZabbixAgent.settings.features.activeCheckServers}}
{% else %}
# NOTE: Active checks are disabled
{% endif %}
### Option: Hostname
# Unique, case sensitive hostname.
# Required for active checks and must match hostname as configured on the server.
# Value is acquired from HostnameItem if undefined.
#
{% if OPNsense.ZabbixAgent.settings.main.hostname|default("") != "" %}
Hostname={{OPNsense.ZabbixAgent.settings.main.hostname}}
{% endif %}
### Option: HostnameItem
# Item used for generating Hostname if it is undefined. Ignored if Hostname is defined.
# Does not support UserParameters or aliases.
#
### Option: HostMetadata
# Optional parameter that defines host metadata.
# Host metadata is used at host auto-registration process.
# An agent will issue an error and not start if the value is over limit of 255 characters.
# If not defined, value will be acquired from HostMetadataItem.
#
### Option: HostMetadataItem
# Optional parameter that defines an item used for getting host metadata.
# Host metadata is used at host auto-registration process.
# During an auto-registration request an agent will log a warning message if
# the value returned by specified item is over limit of 255 characters.
# This option is only used when HostMetadata is not defined.
#
### Option: RefreshActiveChecks
# How often list of active checks is refreshed, in seconds.
#
RefreshActiveChecks={{OPNsense.ZabbixAgent.settings.features.refreshActiveChecks}}
### Option: BufferSend
# Do not keep data longer than N seconds in buffer.
#
BufferSend={{OPNsense.ZabbixAgent.settings.tuning.bufferSend}}
### Option: BufferSize
# Maximum number of values in a memory buffer. The agent will send
# all collected data to Zabbix Server or Proxy if the buffer is full.
#
BufferSize={{OPNsense.ZabbixAgent.settings.tuning.bufferSize}}
### Option: MaxLinesPerSecond
# Maximum number of new lines the agent will send per second to Zabbix Server
# or Proxy processing 'log' and 'logrt' active checks.
# The provided value will be overridden by the parameter 'maxlines',
# provided in 'log' or 'logrt' item keys.
#
MaxLinesPerSecond={{OPNsense.ZabbixAgent.settings.tuning.maxLinesPerSecond}}
############ ADVANCED PARAMETERS #################
### Option: Alias
# Sets an alias for an item key. It can be used to substitute long and complex item key with a smaller and simpler one.
# Multiple Alias parameters may be present. Multiple parameters with the same Alias key are not allowed.
# Different Alias keys may reference the same item key.
# For example, to retrieve the ID of user 'zabbix':
# Alias=zabbix.userid:vfs.file.regexp[/etc/passwd,^zabbix:.:([0-9]+),,,,\1]
# Now shorthand key zabbix.userid may be used to retrieve data.
# Aliases can be used in HostMetadataItem but not in HostnameItem parameters.
#
### Option: Timeout
# Spend no more than Timeout seconds on processing
#
Timeout={{OPNsense.ZabbixAgent.settings.tuning.timeout}}
### Option: AllowRoot
# Allow the agent to run as 'root'. If disabled and the agent is started by 'root', the agent
# will try to switch to the user specified by the User configuration option instead.
# Has no effect if started under a regular user.
# 0 - do not allow
# 1 - allow
#
AllowRoot=0
### Option: User
# Drop privileges to a specific, existing user on the system.
# Only has effect if run as 'root' and AllowRoot is disabled.
#
User=zabbix
### Option: Include
# You may include individual files or all files in a directory in the configuration file.
# Installing Zabbix will create include directory in /usr/local/etc, unless modified during the compile time.
#
Include=/usr/local/etc/zabbix_agentd.d
####### USER-DEFINED MONITORED PARAMETERS #######
### Option: UnsafeUserParameters
# Allow all characters to be passed in arguments to user-defined parameters.
# The following characters are not allowed:
# \ ' " ` * ? [ ] { } ~ $ ! & ; ( ) < > | # @
# Additionally, newline characters are not allowed.
# 0 - do not allow
# 1 - allow
#
### Option: UserParameter
# User-defined parameter to monitor. There can be several user-defined parameters.
# Format: UserParameter=<key>,<shell command>
# See 'zabbix_agentd' directory for examples.
#
# Disabled. A configuration file should be placed on directory: <%= @include %>
####### LOADABLE MODULES #######
### Option: LoadModulePath
# Full path to location of agent modules.
# Default depends on compilation options.
#
#LoadModulePath=/usr/local/lib/modules
### Option: LoadModule
# Module to load at agent startup. Modules are used to extend functionality of the agent.
# Format: LoadModule=<module.so>
# The modules must be located in directory specified by LoadModulePath.
# It is allowed to include multiple LoadModule parameters.
#
####### TLS-RELATED PARAMETERS #######
### Option: TLSConnect
# How the proxy should connect to Zabbix server. Used for an active proxy, ignored on a passive proxy.
# Only one value can be specified:
# unencrypted - connect without encryption
# psk - connect using TLS and a pre-shared key
# cert - connect using TLS and a certificate
#
# Mandatory: yes, if TLS certificate or PSK parameters are defined (even for 'unencrypted' connection)
# Default:
# TLSConnect=unencrypted
### Option: TLSAccept
# What incoming connections to accept from Zabbix server. Used for a passive proxy, ignored on an active proxy.
# Multiple values can be specified, separated by comma:
# unencrypted - accept connections without encryption
# psk - accept connections secured with TLS and a pre-shared key
# cert - accept connections secured with TLS and a certificate
#
# Mandatory: yes, if TLS certificate or PSK parameters are defined (even for 'unencrypted' connection)
# Default:
# TLSAccept=unencrypted
### Option: TLSCAFile
# Full pathname of a file containing the top-level CA(s) certificates for
# peer certificate verification.
#
# Mandatory: no
# Default:
# TLSCAFile=
### Option: TLSCRLFile
# Full pathname of a file containing revoked certificates.
#
# Mandatory: no
# Default:
# TLSCRLFile=
### Option: TLSServerCertIssuer
# Allowed server certificate issuer.
#
# Mandatory: no
# Default:
# TLSServerCertIssuer=
### Option: TLSServerCertSubject
# Allowed server certificate subject.
#
# Mandatory: no
# Default:
# TLSServerCertSubject=
### Option: TLSCertFile
# Full pathname of a file containing the proxy certificate or certificate chain.
#
# Mandatory: no
# Default:
# TLSCertFile=
### Option: TLSKeyFile
# Full pathname of a file containing the proxy private key.
#
# Mandatory: no
# Default:
# TLSKeyFile=
### Option: TLSPSKIdentity
# Unique, case sensitive string used to identify the pre-shared key.
#
# Mandatory: no
# Default:
# TLSPSKIdentity=
### Option: TLSPSKFile
# Full pathname of a file containing the pre-shared key.
#
# Mandatory: no
# Default:
# TLSPSKFile=
{% endif %}

View file

@ -0,0 +1,6 @@
<?php
$logfile = '/var/log/zabbix/zabbix_agentd.log';
$logclog = false;
require_once 'diag_logs_template.inc';