BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 28 апр 2024, 00:18

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
СообщениеДобавлено: 25 июн 2015, 12:55 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
На вики есть пример скрипта

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

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2015, 13:09 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Эта же команда привязанная к устройству в общем дереве устройств . При чем тут договор ? какой из договоров?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2015, 13:15 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
На договоре прописано устройство и интерфейс.
Цитата:
DeviceManagerMethodType.ACCOUNT - означает, что пункт будет доступен на вкладке сервисов договора, в контестном меню сервиса, если в нем установлено устройство этого типа.


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

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2015, 14:51 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Код:
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. Добавим в ближайшее время.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2015, 18:15 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Спасибо Амир.

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

В 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


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

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Последний раз редактировалось Phricker 25 июн 2015, 18:16, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2015, 18:16 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Куда копать одним словом.
Меня смущает строка
Код:
at ru.bitel.bgbilling.modules.inet.access.manage.DeviceManageWorker.doTask(DeviceManageWorker.java:228)

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

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2015, 18:31 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
В 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.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 25 июн 2015, 18:37 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
ИзображениеИзображение Изображение Изображение

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июн 2015, 12:52 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Что-то проклевывается :)
Код:
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

Изображение

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 июн 2015, 13:33 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Amir, а когда примерно будет
Цитата:
Метода getServId() у InetDeviceManageEvent почему-то сейчас нет, поэтому получение servId через reflection. Добавим в ближайшее время.

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

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 02 июл 2015, 18:00 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
up вопрос

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 03 июл 2015, 02:23 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Сегодня выложили.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 14 июл 2015, 15:19 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
И снова апну.
Версии с теста
Код:
Сервер: вер. 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


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

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

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

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

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 июл 2015, 00:36 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Никуда не тыкать?

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 июл 2015, 07:25 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 20 апр 2009, 12:03
Сообщения: 3092
Откуда: Иркутск
Карма: 338
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 ?
Я вроде так и задумывал.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2015, 11:57 
Не в сети
Клиент
Аватара пользователя

Зарегистрирован: 29 мар 2010, 23:11
Сообщения: 5854
Карма: 472
Phricker писал(а):
На видео подробнее

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

ап

_________________
Цитаты великих людей :umnik:
Напишите в helpdesk © stark
повторяю: => хелпдеск => доработка => профит © dimOn
свершилось... © skn
Мой код изящен, лёгок, оригинален, краток. Как прохладный весенний ветерок, как звонкий ручей! © dimOn
Вежливый разработчик © Artur
Эти баги тоже исправлены, как и те, которые еще не написаны © Artur
ну т.е. существует воркэраунд, ок © dimOn


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2015, 17:03 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
В клиенте ошибка. Вроде бы если дважды подряд вызвать меню на одной записи и выполнить команду только второй раз (или сначала выделить строку, а потом вызвать на этой строке меню) - отработает нормально.
Сегодня выложим обновление.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 июл 2015, 18:10 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Не совсем так - отрабатывало с тем сервисом, который был выбран первым, если только на другом типе сервиса не другое устройство с другим типом.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 сен 2016, 20:20 
Не в сети
Клиент

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
POWERED_BY
Русская поддержка phpBB
[ Time : 0.213s | 56 Queries | GZIP : On ]