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; Метода getServId() у InetDeviceManageEvent почему-то сейчас нет, поэтому получение servId через reflection. Добавим в ближайшее время.
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 ); } } |
Автор: | 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){ Т.к. приходит Integer32, а в Walker - String.
if(clazz == String.class){ return clazz.cast(var.toString()); } return clazz.cast(var.toInt()); } |
Автор: | 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){ Т.к. приходит Integer32, а в Walker - String.if(clazz == String.class){ return clazz.cast(var.toString()); } return clazz.cast(var.toInt()); } А не правильнее ли передавать в 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 }) Само собой разумеется, что твой комп должен видеть железку, т.к. пинг идет от твоего компа, а не от сервера с access.
public Object ping() throws Exception { return "ping:" + host; } |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |