Page tree
Skip to end of metadata
Go to start of metadata

Основные функции

Мониторинг основных индикаторов здоровья через SNMP

ВНИМАНИЕ!

Только для Trassir OS


Установка

  • Перейти в автоматизацию, нажать «Загрузить пример» и выбрать «Из файла», указав путь к скрипту.
  • Снять галочку «Включить скрипт» и нажать сохранить.
  • Выполнить настройку и нажать "Сохранить и запустить".

Проверка работы:

  • По ssh заходим на Zabbix и с него проверяем работу службы/скрипта на TrassirOS. 
    snmpwalk -v2c -c dssl ip-address .1.3.6.1.4.1.3333.1.*
    где:

    * - номер индикатора.
    1 db_ok
    2 archive_days
    3 disks_ok
    4 network_ok
    5 cameras
    6 scripts_ok
    7 cloud_ok
    8 cpu_usage


  • В Web интерфейсе Zabbix во вкладке host.
    - создаем хост - create host.
    - в разделе SNMP interfaces - add, где указываем ip-address сервера Trassir, порт 161.
    - сохраняем настройки.
    - во вкладке hosts - item, где создаем итемы согласно настройкам:
    key: SNMP OID:
    Trassir.db_ok .1.3.6.1.4.1.3333.1.1
    Trassir.archive_days .1.3.6.1.4.1.3333.1.2
    Trassir.disks_ok .1.3.6.1.4.1.3333.1.3
    Trassir.network_ok .1.3.6.1.4.1.3333.1.4
    Trassir.cameras .1.3.6.1.4.1.3333.1.5
    Trassir.scripts_ok .1.3.6.1.4.1.3333.1.6
    Trassir.cloud_ok .1.3.6.1.4.1.3333.1.7
    Trassir.cpu_usage .1.3.6.1.4.1.3333.1.8

    Trassir.custom01 .1.3.6.1.4.1.3333.2.1

  • в SNMP community указываем dssl (SNMP community должен называться так же, как прописано в snmpd.conf в строке com2sec world 0.0.0.0/0).
    - сохраняем настройки.
    После выполнения всех настроек Zabbix необходимо перезагрузить.
    Хелсы в Zabbix смотрим во вкладке Monitoring - Overview (хелсы отобразяться спустя время, согласно настроенному таймауту в настрйоках Item).

     code
    code
    """
    <parameters>
    	<parameter>
    	  <type>integer</type>
    	  <id>PORT</id>
    	  <name>Порт для подключения (UDP)</name>
    	  <value>161</value>
    	  <min>1</min>
    	  <max>65000</max>
    	</parameter>
    	<parameter>
    		<type>string</type>
    		<id>IP_LIST</id>
    		<name>Список адресов которым разрешен доступ</name>
    		<value>0.0.0.0/0</value>
    	</parameter>
    </parameters>
    """
    
    import re
    from pysnmp.hlapi import *
    from pysnmp.proto import api
    from subprocess import call
    
    REGEXP = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/([0-9]|[1-2][0-9]|3[0-2]))$"
    CONFIG = "/etc/snmp/snmpd.conf"
    
    pMod = api.protoModules[api.protoVersion2c]
    health = settings("health")
    
    def db_ok():
    	return "ERROR" if not health["db_connected"] else "OK" if health["db_connected"] == 1 else ""
    
    
    def archive_days():
    	days = str( int( health["disks_stat_main_days"] ))
    
    	priv = health["disks_stat_priv_days"]
    	subs = health["disks_stat_subs_days"]
    
    	days += (" / %i" % int( priv )) if priv else ""
    	days += (" / %i" % int( subs )) if subs else ""
    	return days
    
    
    def disks_ok():
    	if health["disks_error_count"] == -1 or health["disks_is_slow"] == -1:
    		return ""
    	elif health["disks_error_count"] > 0 or health["disks_is_slow"]:
    		return "ERROR"
    	else:
    		return "OK"
    
    
    def network_ok():
    	if health["ifconfig_error"]:
    		return "ERROR"
    
    	elif health["network_really_connected"] == -1:
    		return ""
    
    	elif health["network_really_connected"] == health["network_should_be_connected"]:
    		return "OK"
    
    	else:
    		return "%i / %i" %( health["network_really_connected"], health["network_should_be_connected"] )
    
    def cameras():
    	cameras_online  = health["channels_board_online"] + health["channels_network_online"]
    	cameras_enabled = health["channels_board_total"]  + health["channels_network_total"]
    	return "%i / %i" %( cameras_online, cameras_enabled )
    
    
    def scripts_ok():
    	return "OK" if health["scripts_total"] == health["scripts_ok"] else "ERROR"
    
    def cloud_ok():
    	return "ERROR" if health["cloud_have_error"] else "OK"
    
    def cpu_usage():
    	return "%.1f%%" %( health["cpu_usage"] )
    
    
    indicators = [
    	db_ok,
    	archive_days,
    	disks_ok,
    	network_ok,
    	cameras,
    	scripts_ok,
    	cloud_ok,
    	cpu_usage
    	]
    
    
    def handle():
    	r = ''
    	for x in indicators:
    		r += "%s\n" %( x() )
    
    	if health['custom_indicators']:
    		r += "%s" %(";".join([ x.split(';')[1] for x in health['custom_indicators'].split("|") ]))
    
    	next(
    		setCmd(
    			SnmpEngine(),
    			CommunityData('private'),
    			UdpTransportTarget(('localhost', PORT)),
    			ContextData(),
    			ObjectType(
    				ObjectIdentity( '.1.3.6.1.4.1.3333.0' ),
    				pMod.OctetString( r )
    				)
    			)
    		)
    
    def touch_service():
    	if not re.findall(REGEXP,IP_LIST):
    		raise ValueError('value "%s" must be match to IPv4 CIDR'%IP_LIST)
    	if call('sudo sed -i "s/^agentAddress.*/agentAddress udp:%s/g" %s'%(PORT,CONFIG), shell=True):
    		raise ValueError('FAIL setup PORT to config file')
    	if call('sudo sed -i "s/^com2sec world.*/com2sec world %s dssl/g" %s'%(IP_LIST.replace("/","\/"),CONFIG), shell=True):
    		raise ValueError('FAIL to setup IPv4 CIDR value to config file')
    	if call("sudo /etc/init.d/snmpd restart", shell=True):
    		raise ValueError("Failed to start snmpd service")
    
    touch_service()	
    handle()
    health.activate_on_changes( handle )


    Скачать

    Мониторинг здоровья сервера TRASSIR OS через SNMP протокол


  • No labels