forum.bitel.ru
http://forum.bitel.ru/

[6.1] Выполнение команд с помощью обработчика
http://forum.bitel.ru/viewtopic.php?f=19&t=10655
Страница 1 из 1

Автор:  Phricker [ 25 июн 2015, 12:55 ]
Заголовок сообщения:  [6.1] Выполнение команд с помощью обработчика

На вики есть пример скрипта

Если команда выполняется на договоре (DeviceManagerMethodType.ACCOUNT), как получить помимо устройства еще и интерфейс который прописан на договоре?

Автор:  stark [ 25 июн 2015, 13:09 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Эта же команда привязанная к устройству в общем дереве устройств . При чем тут договор ? какой из договоров?

Автор:  Phricker [ 25 июн 2015, 13:15 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

На договоре прописано устройство и интерфейс.
Цитата:
DeviceManagerMethodType.ACCOUNT - означает, что пункт будет доступен на вкладке сервисов договора, в контестном меню сервиса, если в нем установлено устройство этого типа.


Хочу прямо из договора по SNMP смотреть в каком состоянии порт абонента на коммутаторе, и выводить информацию (например если порт в апе то вывести MAC адреса этого порта).

Автор:  Amir [ 25 июн 2015, 14:51 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Код:
package ru.provider.bgbilling.modules.inet.dyn.device;

import java.lang.reflect.Field;

import javax.naming.NamingException;

import org.apache.log4j.Logger;

import ru.bitel.bgbilling.modules.inet.access.Access;
import ru.bitel.bgbilling.modules.inet.access.manage.event.InetDeviceManageEvent;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import ru.bitel.bgbilling.modules.inet.runtime.InetInterfaceMap;
import ru.bitel.bgbilling.modules.inet.runtime.InetServRuntime;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import ru.bitel.oss.systems.inventory.resource.common.DeviceManagerMethodType;
import ru.bitel.oss.systems.inventory.resource.common.bean.Device;
import ru.bitel.oss.systems.inventory.resource.common.bean.DeviceType;
import ru.bitel.oss.systems.inventory.resource.server.DeviceManagerMethod;

public class SnmpDeviceManager
   extends ru.bitel.bgbilling.modules.inet.dyn.device.snmp.SnmpDeviceManager
{
   private static final Logger logger = Logger.getLogger( SnmpDeviceManager.class );

   protected Access access;
   protected int moduleId;

   protected ParameterMap deviceConfig;

   @Override
   public Object init( Setup setup, int moduleId, Device<?, ?> device, DeviceType deviceType, ParameterMap deviceConfig )
   {
      super.init( setup, moduleId, device, deviceType, deviceConfig );

      this.moduleId = moduleId;
      this.deviceConfig = deviceConfig;

      try
      {
         // <bean name="access" class="ru.bitel.bgbilling.modules.inet.access.Access" />
         access = (Access)Setup.getEnvironment().lookup( "access" );
      }
      catch( NamingException ex )
      {
         logger.error( ex.getMessage(), ex );
      }

      return null;
   }

   @DeviceManagerMethod(title = "Монитор", types = { DeviceManagerMethodType.DEVICE, DeviceManagerMethodType.ACCOUNT })
   public Object monitor()
   {
      return "browse:" + deviceConfig.get( "monitor.url", "http://zabbix.intranet.provider.ru/latest.php?hostid=$monitorHostId" ).replaceAll( "\\$monitorHostId", deviceConfig.get( "monitor.hostId", "" ) );
   }

   @DeviceManagerMethod(title = "Telnet")
   public Object telnet()
   {
      return "telnet:" + deviceConfig.get( "telnet.host", this.host ) + " " + deviceConfig.getInt( "telnet.port", 23 );
   }

   @DeviceManagerMethod(title = "Информация по интерфейсу", types = { DeviceManagerMethodType.ACCOUNT })
   public Object ifaceInfo( InetDeviceManageEvent e )
      throws Exception
   {
      final int invDeviceId = e.getDeviceId();
      final int servId = getInetServId( e );

      final InetServRuntime servRuntime = access.getInetServRuntimeMap().get( servId );
      final InetServ inetServ = servRuntime.getInetServ();

      final InetInterfaceMap ifaceMap = InetInterfaceMap.getInstance( access.moduleId );

      String ifaceTitle = ifaceMap.getInterfaceTitle( invDeviceId, inetServ.getInterfaceId() );

      return "ifaceId: " + inetServ.getInterfaceId() + ", ifaceTitle: " + ifaceTitle;
   }

   private int getInetServId( final InetDeviceManageEvent e )
      throws Exception
   {
      Field f = InetDeviceManageEvent.class.getDeclaredField( "servId" );
      f.setAccessible( true );
      return f.getInt( e );
   }
}
Метода getServId() у InetDeviceManageEvent почему-то сейчас нет, поэтому получение servId через reflection. Добавим в ближайшее время.

Автор:  Phricker [ 25 июн 2015, 18:15 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Спасибо Амир.

Столкнулся вот с какой проблемой.
Кромешник писал вот такой вот код

В SnmpDeviceManager я добавил вот такие строки
Код:
    @DeviceManagerMethod(title = "TestMAC", types = { DeviceManagerMethodType.DEVICE })
    public String testMac()
            throws Exception
    {
        final StringBuffer report = new StringBuffer();
        OID testOid = new OID("1.3.6.1.2.1.17.4.3.1.1");
        snmpClient.walk(testOid, String.class, new Walker<String>() {
            @Override
            public void walk(OID oid, String value) {
                report.append(value+"\n");
            }
        });

        return report.toString();
    }
   
    @DeviceManagerMethod(title = "TestPORT", types = { DeviceManagerMethodType.DEVICE })
    public String testPort()
            throws Exception
    {
        final StringBuffer report = new StringBuffer();
        OID testOid = new OID("1.3.6.1.2.1.17.4.3.1.2");
        snmpClient.walk(testOid, String.class, new Walker<String>() {
            @Override
            public void walk(OID oid, String value) {
                report.append(value);
            }
        });

        return report.toString();
    }


Где OID("1.3.6.1.2.1.17.4.3.1.1") возвращает
Изображение

А OID("1.3.6.1.2.1.17.4.3.1.2") возвращает
Изображение


Проблема в следующем.
При выполнении команды TestMAC на устройстве - возвращается длинный список
Изображение

А вот при выполнении TestPORT -
Изображение

В логах следующее
Код:
access 06-25/15:14:12 ERROR [dm-p-13-t-44] Consumer - java.lang.ClassCastException: Cannot cast java.lang.Integer to java.lang.String
ru.bitel.bgbilling.common.BGException: java.lang.ClassCastException: Cannot cast java.lang.Integer to java.lang.String
        at ru.bitel.bgbilling.modules.inet.access.manage.DeviceManageWorker.doTask(DeviceManageWorker.java:228)
        at ru.bitel.bgbilling.kernel.event.EventWorker.notify(EventWorker.java:259)
        at ru.bitel.bgbilling.kernel.event.Consumer.onMessage0(Consumer.java:112)
        at ru.bitel.bgbilling.kernel.event.EventWorker.internalDoTask(EventWorker.java:229)
        at ru.bitel.bgbilling.kernel.event.EventWorker.doTasks(EventWorker.java:208)
        at ru.bitel.bgbilling.modules.inet.access.manage.DeviceManageWorker.runWorker(DeviceManageWorker.java:170)
        at ru.bitel.bgbilling.kernel.event.EventWorker.internalRunWorker(EventWorker.java:139)
        at ru.bitel.bgbilling.modules.inet.access.manage.DeviceManageWorker.runImpl(DeviceManageWorker.java:110)
        at ru.bitel.common.worker.WorkerTask.run(WorkerTask.java:86)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)
        at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46)
Caused by: java.lang.ClassCastException: Cannot cast java.lang.Integer to java.lang.String
        at java.lang.Class.cast(Class.java:3361)
        at ru.ellcom.modules.inet.snmp.SnmpClient.castVariable(SnmpClient.java:171)
        at ru.ellcom.modules.inet.snmp.SnmpClient.walk(SnmpClient.java:103)
        at ru.ellcom.modules.inet.snmp.SnmpDeviceManager.testPort(SnmpDeviceManager.java:123)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at ru.bitel.bgbilling.modules.inet.access.manage.DeviceManageWorker.doCommand(DeviceManageWorker.java:275)
        at ru.bitel.bgbilling.modules.inet.access.manage.DeviceManageWorker.doTask(DeviceManageWorker.java:217)
        ... 16 more


И не пойму то ли я жопорук, то ли я рукожоп.

Автор:  Phricker [ 25 июн 2015, 18:16 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Куда копать одним словом.
Меня смущает строка
Код:
at ru.bitel.bgbilling.modules.inet.access.manage.DeviceManageWorker.doTask(DeviceManageWorker.java:228)

И я не пойму то ли у вас там преобразование не проходит, то ли у меня что то не то.

Автор:  Amir [ 25 июн 2015, 18:31 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

В SnmpClient нужно поправить метод private <V> V castVariable(Variable var, Class<V> clazz)
Код:
        if(var instanceof Integer32){
            if(clazz == String.class){
                return clazz.cast(var.toString());
            }
            return clazz.cast(var.toInt());
        }
Т.к. приходит Integer32, а в Walker - String.

Автор:  Phricker [ 25 июн 2015, 18:37 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

ИзображениеИзображение Изображение Изображение

Автор:  Phricker [ 26 июн 2015, 12:52 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Что-то проклевывается :)
Код:
666.666.666.333#sh mac-address-table | inc Ethernet1/1
88   00-0a-cd-28-1e-d1           SECURED PSecure  Ethernet1/1
88   08-00-27-a7-94-1f           SECURED PSecure  Ethernet1/1

Изображение

Автор:  Phricker [ 26 июн 2015, 13:33 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Amir, а когда примерно будет
Цитата:
Метода getServId() у InetDeviceManageEvent почему-то сейчас нет, поэтому получение servId через reflection. Добавим в ближайшее время.

Неделя-две?
Я пока другое поделаю, чтобы потом уже корректно писать

Автор:  Phricker [ 02 июл 2015, 18:00 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

up вопрос

Автор:  Amir [ 03 июл 2015, 02:23 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Сегодня выложили.

Автор:  Phricker [ 14 июл 2015, 15:19 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

И снова апну.
Версии с теста
Код:
Сервер: вер. 6.2.914 / 09.07.2015 21:39:19
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_31

  inet: вер. 6.2.527 / 09.07.2015 21:39:32


Такой вот кусок скрипта.
Код:
    @DeviceManagerMethod(title = "Test MAC", types = { DeviceManagerMethodType.ACCOUNT })
    public String testMac(InetDeviceManageEvent e)
            throws Exception
    {
        int servId = e.getServId();
        System.out.print("\nservId = " + servId + "\n");
        InetServDao servDao = new InetServDao(this.con, this.mid);
        int interfaceId = servDao.get(servId).getInterfaceId();
        System.out.print("interfaceId = " + interfaceId + "\n");

        return null;
    }


На одном договоре прописано 3 сервиса
Изображение

Пробую на сервисе с ID = 1 выполнить команду.
Возвращает null в окне и в access.out пишет
Код:
servId = 1
interfaceId = 1


Окей вроде бы все в норме.

Пробую на сервисе с ID = 3 (5 порт)
в access.out пишет
Код:
servId = 1
interfaceId = 1


Создаю еще один договор.
Вешаю два сервиса.
Изображение

Опять кешируются данные по тому сервису на котором я первым выполнил команду

На видео подробнее

Куда потыкать и что я сделал не так?

Автор:  Phricker [ 15 июл 2015, 00:36 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Никуда не тыкать?

Автор:  Cromeshnic [ 15 июл 2015, 07:25 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Amir писал(а):
В SnmpClient нужно поправить метод private <V> V castVariable(Variable var, Class<V> clazz)
Код:
        if(var instanceof Integer32){
            if(clazz == String.class){
                return clazz.cast(var.toString());
            }
            return clazz.cast(var.toInt());
        }
Т.к. приходит Integer32, а в Walker - String.


А не правильнее ли передавать в walk не String.class, а Integer32.class ?
Я вроде так и задумывал.

Автор:  Phricker [ 16 июл 2015, 11:57 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Phricker писал(а):
На видео подробнее

Куда потыкать и что я сделал не так?

ап

Автор:  Amir [ 16 июл 2015, 17:03 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

В клиенте ошибка. Вроде бы если дважды подряд вызвать меню на одной записи и выполнить команду только второй раз (или сначала выделить строку, а потом вызвать на этой строке меню) - отработает нормально.
Сегодня выложим обновление.

Автор:  Amir [ 16 июл 2015, 18:10 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Не совсем так - отрабатывало с тем сервисом, который был выбран первым, если только на другом типе сервиса не другое устройство с другим типом.

Выложили обновление.

Автор:  snark [ 06 сен 2016, 20:20 ]
Заголовок сообщения:  Re: [6.1] Выполнение команд с помощью обработчика

Phricker, если добавишь такое, то сможешь пинговать устройство с сервисом ;)
Код:
@DeviceManagerMethod(title = "ping", types = { DeviceManagerMethodType.DEVICE, DeviceManagerMethodType.ACCOUNT })
public Object ping()
    throws Exception
{
    return "ping:" + host;
}
Само собой разумеется, что твой комп должен видеть железку, т.к. пинг идет от твоего компа, а не от сервера с access.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/