Архив метки: zabbix

Контроль касс Атол в Zabbix

Основная задача скрипта — вывести в консоль информацию об основных параметрах кассы, что бы агент заббикса мог как то распарсить данные.

Пример скрипта:

#!/usr/bin/python3.5
# -*- coding: utf-8 -*-
import base64
import ctypes
import sys
import json
import datetime
import os
import platform
from pprint import pprint

from lib import IFptr
#fptr = IFptr("")

#get extr param
if len(sys.argv)==1:
    print ("Возможные параметры:")
    print ("--info IP - общая информация о ККМ")
    exit(0)
arg=sys.argv[1]
if arg=="--info":
    ip=sys.argv[2];
    
LIBRARY_PATH = os.path.dirname(os.path.abspath(__file__))
fptr = IFptr(os.path.join(LIBRARY_PATH, "libfptr10.so"))
#connect to ATOL
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_MODEL, str(IFptr.LIBFPTR_MODEL_ATOL_AUTO))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_PORT, str(IFptr.LIBFPTR_PORT_TCPIP))
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_IPADDRESS, ip)
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_IPPORT,"5555")
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_ACCESS_PASSWORD,"0")
fptr.setSingleSetting(IFptr.LIBFPTR_SETTING_USER_PASSWORD,"30")

fptr.applySingleSettings()
#открываем соединение
fptr.open()
isOpened = fptr.isOpened()
if isOpened==0:
    print ("9) Доступность:",0)
    exit(1)
    
if arg=="--info":
    fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_REG_INFO)
    fptr.fnQueryData()

    taxationTypes               = fptr.getParamInt(1062)
    agentSign                   = fptr.getParamInt(1057)
    ffdVersion                  = fptr.getParamInt(1209)
    print("Версия ФН:",ffdVersion)

    autoModeSign                = fptr.getParamBool(1001)
    offlineModeSign             = fptr.getParamBool(1002)
    encryptionSign              = fptr.getParamBool(1056)
    internetSign                = fptr.getParamBool(1108)
    serviceSign                 = fptr.getParamBool(1109)
    bsoSign                     = fptr.getParamBool(1110)
    lotterySign                 = fptr.getParamBool(1126)
    gamblingSign                = fptr.getParamBool(1193)
    exciseSign                  = fptr.getParamBool(1207)
    machineInstallationSign     = fptr.getParamBool(1221)
    fnsUrl                      = fptr.getParamString(1060)
    organizationVATIN           = fptr.getParamString(1018)
    organizationName            = fptr.getParamString(1048)
    organizationEmail           = fptr.getParamString(1117)
    paymentsAddress             = fptr.getParamString(1187)
    registrationNumber          = fptr.getParamString(1037)
    machineNumber               = fptr.getParamString(1036)
    ofdVATIN                    = fptr.getParamString(1017)
    ofdName                     = fptr.getParamString(1046)
    print("1) Организация:",organizationName)
    print("2) ОФД:",ofdName)
        
    fptr.setParam(IFptr.LIBFPTR_PARAM_DATA_TYPE, IFptr.LIBFPTR_DT_STATUS)
    fptr.queryData()
    serialNumber    = fptr.getParamString(IFptr.LIBFPTR_PARAM_SERIAL_NUMBER)
    modelName       = fptr.getParamString(IFptr.LIBFPTR_PARAM_MODEL_NAME)
    firmwareVersion = fptr.getParamString(IFptr.LIBFPTR_PARAM_UNIT_VERSION)
    print("3) S/N:",serialNumber)
    print("4) Модель:",modelName)
    print("5) Прошивка:",firmwareVersion)
    fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_VALIDITY)
    fptr.fnQueryData()
    dateTime            = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME)
    print("6) Дата окончания ФН:",dateTime)
    fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_LAST_RECEIPT)
    fptr.fnQueryData()
    documentNumber      = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER)
    print("7) Номер чека:",documentNumber)
    # Получение информации о неотправленных документах
    fptr.setParam(IFptr.LIBFPTR_PARAM_FN_DATA_TYPE, IFptr.LIBFPTR_FNDT_OFD_EXCHANGE_STATUS)
    res=fptr.fnQueryData()
    unsentCount = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENTS_COUNT)
    if unsentCount>0:
        unsentFirstNumber = fptr.getParamInt(IFptr.LIBFPTR_PARAM_DOCUMENT_NUMBER)
        unsentDateTime = fptr.getParamDateTime(IFptr.LIBFPTR_PARAM_DATE_TIME)
        print ("8) Не фискализировано:",unsentCount)
        fptr.close()    
        del fptr
        exit(1)
    else:
        print ("8) Не фискализировано:",0)
    print ("9) Доступность:",1)

Пример выполнения:

root@pavel-All-Series:~/online_kassa# ./common.py --info 192.168.0.103
Версия ФН: 105
1) Организация: Индивидуальный предприниматель Пупкин Александр Владимирович
2) ОФД: ООО "Компания "Тензор"
3) S/N: 00103452021133752352
4) Модель: АТОЛ 55Ф
5) Прошивка: 1245
6) Дата окончания ФН: 2021-06-07 00:00:00
7) Номер чека: 414
8) Не фискализировано: 0
9) Доступность: 1

Пример оформления триггера в агенте zabbix:

UserParameter=ping_kassa,/home/pavel/online_kassa/common.py --info 192.168.0.103 | grep "9)" | awk '{print $3}'

UserParameter=non_fiskalize,/home/pavel/online_kassa/common.py --info 192.168.0.103 | grep "8)" | awk '{print $3}'

Еще один полезный SQL запрос для Zabbix

Получение триггеров с учетом зависимостей. Т.е. Если некий тригер А зависит от триггера Б, то его в списке не будет.

SELECT (UNIX_TIMESTAMP()-triggers.lastchange)/60 as minut,hosts.host,        triggers.description,        triggers.comments,        triggers.triggerid FROM triggers INNER JOIN functions ON triggers.triggerid=functions.triggerid INNER JOIN items ON items.itemid=functions.itemid INNER JOIN hosts ON hosts.hostid=items.hostid INNER JOIN hosts_groups ON hosts_groups.hostid=hosts.hostid INNER JOIN groups ON groups.groupid=hosts_groups.groupid WHERE hosts.status = 0   AND items.status = 0   AND triggers.status = 0   AND triggers.priority=5   AND triggers.value=1 and ((UNIX_TIMESTAMP()-triggers.lastchange)/60)>15 and triggers.triggerid in (select triggerid_up from trigger_depends where triggerid_down in (SELECT triggers.triggerid FROM triggers INNER JOIN functions ON triggers.triggerid=functions.triggerid INNER JOIN items ON items.itemid=functions.itemid INNER JOIN hosts ON hosts.hostid=items.hostid INNER JOIN hosts_groups ON hosts_groups.hostid=hosts.hostid INNER JOIN groups ON groups.groupid=hosts_groups.groupid WHERE hosts.status = 0   AND items.status = 0   AND triggers.status = 0   AND triggers.priority=5   AND triggers.value=1 and ((UNIX_TIMESTAMP()-triggers.lastchange)/60)>15 group by triggerid))  group by triggers.triggerid

Отправляем сообщения пользователям Telegram из коммандной строки. FreeBSD

1) Ставим из портов trelegram-cli

cd /usr/ports/net-im/telegram
make install

2) Заходим в telegram-cli, регистрируемся. По help — список комманд.

Нюансы: сначала нужно добавить контакты. Отправлять сообщения тоже можно не сразу, а только после выполнения комманды contact_list. Или запускать telegram-cli с ключем -W

Пробелы в именах при операциях с коммандами необходимо заменять на _

Например отправка сообщения:

msg Gribov_Pavel "Привет"

3) Для получения списка контактов и их состояния, можно использовать что-то типа на PHP (требует доработки):

#!/usr/local/bin/php
<?php

/* 
 * (с) 2016 Грибов Павел
 * http://грибовы.рф * 
 * Если исходный код найден в сети - значит лицензия GPL v.3 * 
 * В противном случае - код собственность ГК Яртелесервис, Мультистрим, Телесервис, Телесервис плюс * 
 */
$path="/usr/local/bin/telegram-cli";  //где находится консольный телеграм whereis telegram-cli

function GetContacts(){    
    global $path;
    $result=array();
    $rez=`( echo "contact_list" ; echo "safe_quit" ) | $path -RCW -U root | grep -v halt | grep -v "All" | grep "under" -A 100000 | grep -v "licen" `;
    $res_arr=  explode("\n", $rez);    
    foreach ($res_arr as $value) {	
	$value=trim($value);
	$value=preg_replace("/[^a-zA-ZА-Яа-я0-9\s]/","", $value);
	if ($value!=""){
	 $value=  str_replace(" ", "_", $value);
	 $result[$value]["name"]=$value;
	};
    };
    return $result;
};
function StatusInfo($contact_list){
    return $contact_list;
};
 $contact_list=GetContacts();
 $contact_list=StatusInfo($contact_list);
 var_dump($contact_list);
?>

Из огромных минусов такого способа информирования — нельзя знать наверняка, получил контакт сообщение или нет. Во первых нет в API получения статуса отправленого сообщения, а во вторых  — при свернутом в трей телеграмме, статус контакта будет offline. Т.е. нет уверенности, на самом деле контакт в оффлайне, или у него приложение просто свернуто. Этот огромный жирный минус перечеркивает все достоинства Telegram, и соответственно использовать его для информирования например событий  в Zabbix не представляется возможным

 

Zabbix: Получаем по известному триггеру (triggerid) номера телефонов для оповещения

Мега запрос..

SELECT
  sendto
FROM media
WHERE userid IN (SELECT
  userid
FROM (SELECT
  users_groups.userid
FROM operations
INNER JOIN opmessage_grp
  ON opmessage_grp.operationid = operations.operationid
INNER JOIN users_groups
  ON opmessage_grp.usrgrpid = users_groups.usrgrpid
WHERE operations.actionid IN (SELECT
  actionid
FROM conditions
WHERE conditiontype = 2
AND value = 15266
UNION ALL
SELECT
  actionid
FROM conditions
WHERE conditiontype = 0
AND value IN (SELECT
  groups.groupid
FROM triggers
INNER JOIN functions
  ON triggers.triggerid = functions.triggerid
INNER JOIN items
  ON items.itemid = functions.itemid
INNER JOIN hosts
  ON hosts.hostid = items.hostid
INNER JOIN hosts_groups
  ON hosts_groups.hostid = hosts.hostid
INNER JOIN groups
  ON groups.groupid = hosts_groups.groupid
WHERE triggers.triggerid = 15266)
UNION ALL
SELECT
  actionid
FROM conditions
WHERE conditiontype = 1
AND value IN (SELECT
  hosts.hostid
FROM triggers
INNER JOIN functions
  ON triggers.triggerid = functions.triggerid
INNER JOIN items
  ON items.itemid = functions.itemid
INNER JOIN hosts
  ON hosts.hostid = items.hostid
INNER JOIN hosts_groups
  ON hosts_groups.hostid = hosts.hostid
INNER JOIN groups
  ON groups.groupid = hosts_groups.groupid
WHERE triggers.triggerid = 15266))
UNION ALL
SELECT
  opmessage_usr.userid
FROM operations
INNER JOIN opmessage_usr
  ON opmessage_usr.operationid = operations.operationid
WHERE operations.actionid IN (SELECT
  actionid
FROM conditions
WHERE conditiontype = 2
AND value = 15266
UNION ALL
SELECT
  actionid
FROM conditions
WHERE conditiontype = 0
AND value IN (SELECT
  groups.groupid
FROM triggers
INNER JOIN functions
  ON triggers.triggerid = functions.triggerid
INNER JOIN items
  ON items.itemid = functions.itemid
INNER JOIN hosts
  ON hosts.hostid = items.hostid
INNER JOIN hosts_groups
  ON hosts_groups.hostid = hosts.hostid
INNER JOIN groups
  ON groups.groupid = hosts_groups.groupid
WHERE triggers.triggerid = 15266)
UNION ALL
SELECT
  actionid
FROM conditions
WHERE conditiontype = 1
AND value IN (SELECT
  hosts.hostid
FROM triggers
INNER JOIN functions
  ON triggers.triggerid = functions.triggerid
INNER JOIN items
  ON items.itemid = functions.itemid
INNER JOIN hosts
  ON hosts.hostid = items.hostid
INNER JOIN hosts_groups
  ON hosts_groups.hostid = hosts.hostid
INNER JOIN groups
  ON groups.groupid = hosts_groups.groupid
WHERE triggers.triggerid = 15266))) AS us
GROUP BY userid)
AND mediatypeid = 5;

Zabbix — MySQL запрос на выборку текущих активных алертов

SELECT groups.name,
       hosts.hostid,
       hosts.host,
       triggers.description,
       triggers.comments,
       triggers.triggerid,
       triggers.priority
FROM triggers
INNER JOIN functions ON triggers.triggerid=functions.triggerid
INNER JOIN items ON items.itemid=functions.itemid
INNER JOIN hosts ON hosts.hostid=items.hostid
INNER JOIN hosts_groups ON hosts_groups.hostid=hosts.hostid
INNER JOIN groups ON groups.groupid=hosts_groups.groupid
WHERE hosts.status = 0
  AND items.status = 0
  AND triggers.status = 0
  AND triggers.priority=3
  AND triggers.value=1;

Выбираем кто из пользователей Zabbix видит хост:

SELECT  
    usrgrp.usrgrpid ,  
    usrgrp.name  AS  user_group ,  
    groups.name  as  host_group , 
    host 
FROM  users  
    JOIN users_groups   ON  users.userid  =  users_groups.userid  
    JOIN usrgrp ON  users_groups.usrgrpid  =  usrgrp.usrgrpid  
    JOIN rights  ON  usrgrp.usrgrpid  =  rights.groupid  
    JOIN groups ON  rights.id  =  groups.groupid  
    JOIN hosts_groups  ON  groups.groupid  =  hosts_groups.groupid  
    JOIN hosts on  hosts_groups.hostid  =  hosts.hostid
    where hosts.hostid=1025;