forum.bitel.ru http://forum.bitel.ru/ |
|
класс TelnetSession иногда подвисает при логине на свитч http://forum.bitel.ru/viewtopic.php?f=7&t=2271 |
Страница 1 из 1 |
Автор: | msh [ 02 май 2009, 18:16 ] |
Заголовок сообщения: | класс TelnetSession иногда подвисает при логине на свитч |
Имеется следующий скрипт по управлению шлюзом DLINK который ничего не делает а только логинится на свитч и вылогинивается. Код: import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; import bitel.billing.common.IPUtils; import bitel.billing.common.module.ipn.IPNContractStatus; import bitel.billing.server.ipn.UserStatus; import bitel.billing.server.ipn.bean.ManadUtils; import bitel.billing.server.ipn.bean.VlanManager; import bitel.billing.server.ipn.dlink.UserPortStatus; import bitel.billing.server.util.DefaultServerSetup; import bitel.billing.server.util.Utils; import bitel.billing.server.util.telnet.OperationTimedoutException; import bitel.billing.server.util.telnet.TelnetSession; protected void doSync(){ log.info( "script started" ); try { log.info( "script started 1" ); host = gate.getHost(); port = gate.getPort(); DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" ); pswd = gate.getKeyword(); login = gateSetup.getStringValue( "login"); result = new StringBuffer(); log.info( gate.getId() + " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd ); TelnetSession session = new TelnetSession( host, port); session.setLoginPromptSequence( "name:" ); log.info( "before connect" ); session.connect(); log.info( "after connect" ); session.setLoginPromptSequence( "word:" ); result.append( session.doCommand( login ) ); log.info( "after command" ); session.setLoginPromptSequence( "#" ); result.append( session.doCommand( pswd ) ); //TODO commands here session.setLoginPromptSequence( "****" ); result.append( session.doCommand( "logout" ) ); log.info( result.toString() ); Thread.sleep( 100 ); log.info( "ok" ); } catch (Exception e) { log.info("error detected", e ); //throw new RuntimeException ( e ); } finally { log.info( "end of Dlink_SWITCH........................................................"); if(( session != null ) && ( session != void )) { session.disconnect(); } } }; примерно в 30% случаев изменения состояния шлюза из договор->модули->выделенные каналы -> шлюзы он зависает на логине к свитчу причем при этом виснет и клиентский интерфейс содержимое логов сервера файл server.log Код: INFO 02.05.2009 15:49:49 Running script INFO 02.05.2009 15:49:49 script started INFO 02.05.2009 15:49:49 script started 1 INFO 02.05.2009 15:49:50 6 gate: 10.7.253.12:23 login: admin pswd: preved INFO 02.05.2009 15:49:50 before connect траффик между свитчем и биллингом Код: 15:52:23.815097 IP 62.140.242.100.50840 > 10.7.253.12.23: S 112173738:112173738(0) win 5840 <mss 1460,sackOK,timestamp 14119778 0,nop,wscale 6> 0x0000: 4500 003c d1c8 4000 4006 30ef 3e8c f264 E..<..@.@.0.>..d 0x0010: 0a07 fd0c c698 0017 06af a2aa 0000 0000 ................ 0x0020: a002 16d0 14ea 0000 0204 05b4 0402 080a ................ 0x0030: 00d7 7362 0000 0000 0103 0306 ..sb........ 15:52:23.816961 IP 10.7.253.12.23 > 62.140.242.100.50840: S 1019828298:1019828298(0) ack 112173739 win 8192 <mss 1444,nop,wscale 0,nop,nop,timestamp 196689 14119778> 0x0000: 4500 003c 4c54 0000 1d06 1964 0a07 fd0c E..<LT.....d.... 0x0010: 3e8c f264 0017 c698 3cc9 584a 06af a2ab >..d....<.XJ.... 0x0020: a012 2000 7958 0000 0204 05a4 0103 0300 ....yX.......... 0x0030: 0101 080a 0003 0051 00d7 7362 .......Q..sb 15:52:23.816983 IP 62.140.242.100.50840 > 10.7.253.12.23: . ack 1 win 92 <nop,nop,timestamp 14119778 196689> 0x0000: 4500 0034 d1c9 4000 4006 30f6 3e8c f264 E..4..@.@.0.>..d 0x0010: 0a07 fd0c c698 0017 06af a2ab 3cc9 584b ............<.XK 0x0020: 8010 005c c4b0 0000 0101 080a 00d7 7362 ...\..........sb 0x0030: 0003 0051 ...Q 15:52:23.851993 IP 10.7.253.12.23 > 62.140.242.100.50840: P 1:4(3) ack 1 win 8192 <nop,nop,timestamp 196689 14119778> 0x0000: 4500 0037 4c56 0000 1d06 1967 0a07 fd0c E..7LV.....g.... 0x0010: 3e8c f264 0017 c698 3cc9 584b 06af a2ab >..d....<.XK.... 0x0020: 8018 2000 a203 0000 0101 080a 0003 0051 ...............Q 0x0030: 00d7 7362 fffd 03 ..sb... 15:52:23.852011 IP 62.140.242.100.50840 > 10.7.253.12.23: . ack 4 win 92 <nop,nop,timestamp 14119787 196689> 0x0000: 4500 0034 d1ca 4000 4006 30f5 3e8c f264 E..4..@.@.0.>..d 0x0010: 0a07 fd0c c698 0017 06af a2ab 3cc9 584e ............<.XN 0x0020: 8010 005c c4a4 0000 0101 080a 00d7 736b ...\..........sk 0x0030: 0003 0051 ...Q 15:52:23.852931 IP 10.7.253.12.23 > 62.140.242.100.50840: . 4:93(89) ack 1 win 8192 <nop,nop,timestamp 196689 14119778> 0x0000: 4500 008d 4c58 0000 1d06 190f 0a07 fd0c E...LX.......... 0x0010: 3e8c f264 0017 c698 3cc9 584e 06af a2ab >..d....<.XN.... 0x0020: 8010 2000 b814 0000 0101 080a 0003 0051 ...............Q 0x0030: 00d7 7362 fffb 03ff fb01 1b5b 306d 1b5b ..sb.......[0m.[ 0x0040: 313b 3148 1b5b 324a 0d44 0d20 2020 2020 1;1H.[2J.D...... 0x0050: 2020 2020 2020 0d0a 0d20 2020 2020 2020 ................ 0x0060: 2020 2020 2020 2044 4553 2d33 3532 3620 .......DES-3526. 0x0070: 4661 7374 2045 7468 6572 6e65 7420 5377 Fast.Ethernet.Sw 0x0080: 6974 6368 2043 6f6d 6d61 6e64 20 itch.Command. 15:52:23.852938 IP 62.140.242.100.50840 > 10.7.253.12.23: . ack 93 win 92 <nop,nop,timestamp 14119787 196689> 0x0000: 4500 0034 d1cb 4000 4006 30f4 3e8c f264 E..4..@.@.0.>..d 0x0010: 0a07 fd0c c698 0017 06af a2ab 3cc9 58a7 ............<.X. 0x0020: 8010 005c c44b 0000 0101 080a 00d7 736b ...\.K........sk 0x0030: 0003 0051 ...Q 15:52:23.856145 IP 10.7.253.12.23 > 62.140.242.100.50840: P 93:250(157) ack 1 win 8192 <nop,nop,timestamp 196689 14119787> 0x0000: 4500 00d1 4c5a 0000 1d06 18c9 0a07 fd0c E...LZ.......... 0x0010: 3e8c f264 0017 c698 3cc9 58a7 06af a2ab >..d....<.X..... 0x0020: 8018 2000 ed1e 0000 0101 080a 0003 0051 ...............Q 0x0030: 00d7 736b 4c69 6e65 2049 6e74 6572 6661 ..skLine.Interfa 0x0040: 6365 0d0a 0d0d 0a0d 2020 2020 2020 2020 ce.............. 0x0050: 2020 2020 2020 2020 2020 2020 2020 2020 ................ 0x0060: 2020 2020 4669 726d 7761 7265 3a20 4275 ....Firmware:.Bu 0x0070: 696c 6420 352e 3031 2e42 3532 0d0a 0d20 ild.5.01.B52.... 0x0080: 2020 2020 2020 2020 2020 2043 6f70 7972 ...........Copyr 0x0090: 6967 6874 2843 2920 3230 3038 2044 2d4c ight(C).2008.D-L 0x00a0: 696e 6b20 436f 7270 6f72 6174 696f 6e2e ink.Corporation. 0x00b0: 2041 6c6c 2072 6967 6874 7320 7265 7365 .All.rights.rese 0x00c0: 7276 6564 2e0d 0a0d 7573 6572 6e61 6d65 rved....username 0x00d0: 3a : 15:52:23.856152 IP 62.140.242.100.50840 > 10.7.253.12.23: . ack 250 win 108 <nop,nop,timestamp 14119788 196689> 0x0000: 4500 0034 d1cc 4000 4006 30f3 3e8c f264 E..4..@.@.0.>..d 0x0010: 0a07 fd0c c698 0017 06af a2ab 3cc9 5944 ............<.YD 0x0020: 8010 006c c39d 0000 0101 080a 00d7 736c ...l..........sl 0x0030: 0003 0051 ...Q 15:52:23.917301 IP 62.140.242.100.50840 > 10.7.253.12.23: P 1:2(1) ack 250 win 108 <nop,nop,timestamp 14119803 196689> 0x0000: 4500 0035 d1cd 4000 4006 30f1 3e8c f264 E..5..@.@.0.>..d 0x0010: 0a07 fd0c c698 0017 06af a2ab 3cc9 5944 ............<.YD 0x0020: 8018 006c 382c 0000 0101 080a 00d7 737b ...l8,........s{ 0x0030: 0003 0051 ff ...Q. 15:52:24.030867 IP 10.7.253.12.23 > 62.140.242.100.50840: . ack 2 win 8192 <nop,nop,timestamp 196689 14119803> 0x0000: 4500 0034 4c5c 0000 1d06 1964 0a07 fd0c E..4L\.....d.... 0x0010: 3e8c f264 0017 c698 3cc9 5944 06af a2ac >..d....<.YD.... 0x0020: 8010 2000 a3f9 0000 0101 080a 0003 0051 ...............Q 0x0030: 00d7 737b ..s{ 15:52:24.030890 IP 62.140.242.100.50840 > 10.7.253.12.23: P 2:10(8) ack 250 win 108 <nop,nop,timestamp 14119832 196689> 0x0000: 4500 003c d1ce 4000 4006 30e9 3e8c f264 E..<..@.@.0.>..d 0x0010: 0a07 fd0c c698 0017 06af a2ac 3cc9 5944 ............<.YD 0x0020: 8018 006c 3833 0000 0101 080a 00d7 7398 ...l83........s. 0x0030: 0003 0051 fc03 fffe 03ff fe01 ...Q........ 15:52:24.034617 IP 10.7.253.12.23 > 62.140.242.100.50840: P 250:253(3) ack 10 win 8192 <nop,nop,timestamp 196689 14119832> 0x0000: 4500 0037 4c5e 0000 1d06 195f 0a07 fd0c E..7L^....._.... 0x0010: 3e8c f264 0017 c698 3cc9 5944 06af a2b4 >..d....<.YD.... 0x0020: 8018 2000 a0ca 0000 0101 080a 0003 0051 ...............Q 0x0030: 00d7 7398 fffe 03 ..s.... 15:52:24.074227 IP 62.140.242.100.50840 > 10.7.253.12.23: . ack 253 win 108 <nop,nop,timestamp 14119843 196689> 0x0000: 4500 0034 d1cf 4000 4006 30f0 3e8c f264 E..4..@.@.0.>..d 0x0010: 0a07 fd0c c698 0017 06af a2b4 3cc9 5947 ............<.YG 0x0020: 8010 006c c35a 0000 0101 080a 00d7 73a3 ...l.Z........s. 0x0030: 0003 0051 ...Q 15:52:24.075881 IP 10.7.253.12.23 > 62.140.242.100.50840: P 253:259(6) ack 10 win 8192 <nop,nop,timestamp 196689 14119843> 0x0000: 4500 003a 4c60 0000 1d06 195a 0a07 fd0c E..:L`.....Z.... 0x0010: 3e8c f264 0017 c698 3cc9 5947 06af a2b4 >..d....<.YG.... 0x0020: 8018 2000 a3ba 0000 0101 080a 0003 0051 ...............Q 0x0030: 00d7 73a3 fffc 03ff fc01 ..s....... 15:52:24.114225 IP 62.140.242.100.50840 > 10.7.253.12.23: . ack 259 win 108 <nop,nop,timestamp 14119853 196689> 0x0000: 4500 0034 d1d0 4000 4006 30ef 3e8c f264 E..4..@.@.0.>..d 0x0010: 0a07 fd0c c698 0017 06af a2b4 3cc9 594d ............<.YM 0x0020: 8010 006c c34a 0000 0101 080a 00d7 73ad ...l.J........s. 0x0030: 0003 0051 ...Q предполагаю что почему-то иногда биллинг не распознает приглашение свитча к вводу логина "username:". Приглашение ввода логина при подключении к свитчу телнетом. Код: DES-3526 Fast Ethernet Switch Command Line Interface Firmware: Build 5.01.B52 Copyright(C) 2008 D-Link Corporation. All rights reserved. username: версия биллинга 4.5 сборка 415 |
Автор: | stark [ 04 май 2009, 18:16 ] |
Заголовок сообщения: | |
попробуйте сменить "session.setLoginPromptSequence( "name:" );" на "session.setLoginPromptSequence( ":" );" |
Автор: | stark [ 04 май 2009, 18:24 ] |
Заголовок сообщения: | |
вообще так сложно пока сказать ..нужен доступ к такому свичу, чтобы в этом разобраться |
Автор: | stark [ 04 май 2009, 19:46 ] |
Заголовок сообщения: | |
dlink нормально работает, проверили |
Автор: | msh [ 04 май 2009, 20:39 ] |
Заголовок сообщения: | |
stark писал(а): попробуйте сменить "session.setLoginPromptSequence( "name:" );" на
"session.setLoginPromptSequence( ":" );" так там же в баннере присутствует символ ":" после слова firmware что приводит иногда к досрочному выходу из функции ожидания |
Автор: | msh [ 04 май 2009, 20:40 ] |
Заголовок сообщения: | |
stark писал(а): dlink нормально работает, проверили
сколько раз проверяли?- проблема носит случайных характер dlink c такой же прошивкой? там кстати timeout в методе connect и doCommand не предусиотрены? |
Автор: | stark [ 05 май 2009, 13:15 ] |
Заголовок сообщения: | |
msh писал(а): stark писал(а): dlink нормально работает, проверили сколько раз проверяли?- проблема носит случайных характер dlink c такой же прошивкой? есть целый город с железками - des-3526, 3550, 3852, 3828, 3028, dgs-3200-10 . Я понаблюдаю msh писал(а): там кстати timeout в методе connect и doCommand не предусиотрены?
да., но только в версии 4.6 ставится timeout у сессии ..в 4.5 нет |
Автор: | msh [ 07 май 2009, 01:49 ] |
Заголовок сообщения: | |
написал свой класс аналогичный TelnetSession при его использовании зависания не выявлены ищите ошибку ![]() Код: public MyTelnetSession(String phost, int pport)
{ String host; int port; Socket socket = null; String loginPromptSequence = ">"; BufferedInputStream is = null; PrintStream os = null; host = phost; port = pport; void connect() throws IOException, bitel.billing.server.util.telnet.OperationTimedoutException { log.info( "connect to"+this.host ); socket = new Socket(this.host, this.port); socket.setSoTimeout(0); InputStream input = this.socket.getInputStream(); OutputStream out = this.socket.getOutputStream(); is = new BufferedInputStream(input); os = new PrintStream(out, true); InputUntilStringFound(loginPromptSequence); } String doCommand(String command, String endString) throws IOException, bitel.billing.server.util.telnet.OperationTimedoutException { PrintWriter pw = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()),true); pw.print(command + "\r\n"); pw.flush(); return InputUntilStringFound(endString); } void doCommandAsync(String command) throws IOException, bitel.billing.server.util.telnet.OperationTimedoutException { PrintWriter pw = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()),true); pw.print(command + "\r\n"); pw.flush(); } String doCommand(String command) throws IOException, bitel.billing.server.util.telnet.OperationTimedoutException { return doCommand(command, this.loginPromptSequence); } String getLoginPromptSequence() { return this.loginPromptSequence; } void setLoginPromptSequence(String ploginPromptSequence) { loginPromptSequence = ploginPromptSequence; } void disconnect() { try { this.socket.close(); } catch (Exception e) { e.printStackTrace(); } } String InputUntilStringFound(String FindString)throws IOException{ //просматриваем входную строку до нахождения в ней шаблона FindString curwin = new StringBuffer(); retstring = new StringBuffer(); long lastTime = System.currentTimeMillis(); long now = lastTime; int filledbuffer = 0; //флаг показывающий заполнен ли буффер int timeout = 400000; while (now - lastTime < timeout){ if (is.available()>0){ c = (char)is.read(); curwin.append(c); retstring.append(c); if (curwin.length()==FindString.length()){ //буффер полностью заполнен filledbuffer = 1; } if (FindString.contentEquals(curwin)) { //паттерн найден return retstring.toString(); } if (filledbuffer == 1) { //удаляем первый символ из окна curwin.deleteCharAt(0); } }else{ Thread.sleep(100); } now = System.currentTimeMillis(); } log.info( "timeout!!!!!!!!!!!!!!!!!!!!"); return "";//timeout } return this; } |
Автор: | Heggi [ 07 май 2009, 10:04 ] |
Заголовок сообщения: | |
msh писал(а): написал свой класс аналогичный TelnetSession
при его использовании зависания не выявлены ищите ошибку ![]() Подскажи, как твой класс подсунуть вместо штатного? Возможно мне он тоже поможет в моей проблеме. |
Автор: | msh [ 07 май 2009, 15:13 ] |
Заголовок сообщения: | |
Цитата: Подскажи, как твой класс подсунуть вместо штатного? Возможно мне он тоже поможет в моей проблеме.
он просто копируется в текст скрипта шлюза а затем строчка в скрипте TelnetSession session = new TelnetSession( host, port); заменяется на session = MyTelnetSession( host, port); в начало скрипта еще надо добавить Код: import java.io.IOException;
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.lang.System; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.PrintWriter; import java.net.Socket; |
Автор: | Heggi [ 07 май 2009, 22:35 ] |
Заголовок сообщения: | |
Мда... Не работает, т.к. нет полной реализации протокола Telnet Циска запрашивает параметры терминала, а твой класс на такое отвечать не умеет... вот и висим... (какой-то навороченный телнет у моей циски, слишком умный) |
Автор: | msh [ 08 май 2009, 00:49 ] |
Заголовок сообщения: | |
Heggi писал(а): Мда... Не работает, т.к. нет полной реализации протокола Telnet
Циска запрашивает параметры терминала, а твой класс на такое отвечать не умеет... вот и висим... (какой-то навороченный телнет у моей циски, слишком умный) что-то очень замудреная циска на нее даже netcat -ом зайти не получается? вроде по стандарту телнет находится в режиме приема данных и если на команду ничего не отвечать то удаленная сторона должна понять что данная комадна не поддерживается. ну можно на все запросы отвечать что опция не поддерживается |
Автор: | Heggi [ 08 май 2009, 01:00 ] |
Заголовок сообщения: | |
Кто причешет в божеский вид - скажу большое спасибо... У меня уже крыша едет от жабы -) Код: import java.util.HashMap;
import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.lang.System; import java.io.BufferedInputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.PrintWriter; import java.net.Socket; import org.apache.commons.net.telnet.*; import org.apache.commons.net.io.*; import bitel.billing.common.module.ipn.CiscoRuleOptions; import bitel.billing.common.module.ipn.IPNContractStatus; import bitel.billing.server.ipn.GateWorker; import bitel.billing.server.ipn.UserStatus; import bitel.billing.server.ipn.bean.AclOptions; import bitel.billing.server.ipn.bean.ManadUtils; import bitel.billing.server.util.DefaultServerSetup; import bitel.billing.server.util.Utils; import bitel.billing.server.util.telnet.TelnetSession; public class MyTelnetSession { String host; int port; TelnetClient socket = null; String loginPromptSequence = ":"; BufferedInputStream is = null; PrintStream os = null; public MyTelnetSession(String phost, int pport) { host = phost; port = pport; return this; } void connect() throws IOException, bitel.billing.server.util.telnet.OperationTimedoutException { log.info( "connect to "+this.host ); socket = new TelnetClient(); TerminalTypeOptionHandler ttopt = new TerminalTypeOptionHandler("VT100", false, false, true, true); EchoOptionHandler echoopt = new EchoOptionHandler(true, false, true, false); SuppressGAOptionHandler gaopt = new SuppressGAOptionHandler(false, false, false, false); socket.addOptionHandler( ttopt ); socket.addOptionHandler( echoopt ); socket.addOptionHandler( gaopt ); socket.connect(this.host, this.port); log.info( "connect ,,,... " ); InputStream input = socket.getInputStream(); // null until client connected OutputStream output = socket.getOutputStream(); is = new BufferedInputStream(input); os = new PrintStream(output, true); log.info( "go to InputUntilStringFound " ); InputUntilStringFound(loginPromptSequence); } String doCommand(String command, String endString) throws IOException, bitel.billing.server.util.telnet.OperationTimedoutException { PrintWriter pw = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()),true); pw.print(command + "\r\n"); pw.flush(); return InputUntilStringFound(endString); } void doCommandAsync(String command) throws IOException, bitel.billing.server.util.telnet.OperationTimedoutException { PrintWriter pw = new PrintWriter(new OutputStreamWriter(this.socket.getOutputStream()),true); pw.print(command + "\r\n"); pw.flush(); } String doCommand(String command) throws IOException, bitel.billing.server.util.telnet.OperationTimedoutException { return doCommand(command, this.loginPromptSequence); } String getLoginPromptSequence() { return this.loginPromptSequence; } void setLoginPromptSequence(String ploginPromptSequence) { loginPromptSequence = ploginPromptSequence; } void disconnect() { try { this.socket.disconnect(); } catch (Exception e) { e.printStackTrace(); } } String InputUntilStringFound(String FindString)throws IOException { log.info( "InputUntilStringFound" ); //просматриваем входную строку до нахождения в ней шаблона FindString curwin = new StringBuffer(); retstring = new StringBuffer(); long lastTime = System.currentTimeMillis(); long now = lastTime; int filledbuffer = 0; //флаг показывающий заполнен ли буффер int timeout = 400000; while (now - lastTime < timeout){ if (is.available()>0){ c = (char)is.read(); log.info( "read: "+c ); curwin.append(c); retstring.append(c); if (curwin.length()==FindString.length()){ //буффер полностью заполнен filledbuffer = 1; } if (FindString.contentEquals(curwin)) { //паттерн найден return retstring.toString(); } if (filledbuffer == 1) { //удаляем первый символ из окна curwin.deleteCharAt(0); } }else{ Thread.sleep(100); } now = System.currentTimeMillis(); } log.info( "timeout!!!!!!!!!!!!!!!!!!!!"); return "";//timeout } } doSync() { host = gate.getHost(); port = gate.getPort(); gid = gate.getId(); gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" ); login = gateSetup.getStringValue( "login", "root" ); pswd = gate.getKeyword(); if( log.isDebugEnabled() ) { log.debug( gid + " gate: " + host + ":" + port + " login: " + login + " pswd: " + pswd ); } //SSHSession session = null; session = null; try { session = new MyTelnetSession( host, port ); session.setLoginPromptSequence( ":" ); System.out.println( "before connect" ); session.connect(); System.out.println( "after connect" ); System.out.println( session.doCommand( login ) ); session.setLoginPromptSequence( "#" ); session.doCommand( pswd ); System.out.println( "after password" ); session.doCommand( "terminal length 0" ); result = new StringBuffer(); list = ( session.doCommand( "show access-list" ) ); result.append( list ); if( log.isDebugEnabled() ) { log.debug( gid +" AccessList taking.." ); log.debug( result ); } // код ACL - стуктура с описанием aclMap = AclOptions.getAclMapById( gateSetup ); // имя ACL - стуктура с описанием aclByNameMap = new HashMap(); for( AclOptions option : aclMap.values() ) { aclByNameMap.put( option.name, option ); } result.append( session.doCommand( "configure terminal" ) ); // проход по ACL списку с отметкой какие договора открыты markOpenFromRules( list, aclByNameMap ); // подготовка списка корректирующих команд buildCommandsLists( aclMap ); for( AclOptions options : aclMap.values() ) { if( options.commands.size() > 0 ) { // TODO: extended или нет - надо смотреть в конфиге result.append( session.doCommand( "ip access-list extended " + options.name ) ); if( log.isDebugEnabled() ) { log.debug( gid + " ACL " + options.name ); } for( String command : options.commands ) { if( log.isDebugEnabled() ) { log.debug( gid + " " + command ); } result.append( session.doCommand( command ) ); } } } //выход из configure result.append( session.doCommand( "exit" ) ); session.doCommandAsync( "exit" ); if (log.isDebugEnabled()) { log.debug( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); log.debug( result.toString() ); log.debug( "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); } // пауза пока считает команду exit Thread.sleep( 100 ); } catch ( Exception e ) { throw new RuntimeException ( e ); } finally { if( session != null ) { session.disconnect(); } } } buildCommandsLists( aclMap ) { for( status : statusList ) { ruleOptions = CiscoRuleOptions.extractParams( status.rule.getRuleText() ); options = aclMap.get( ruleOptions.aclId ); // флаг того то правило есть на шлюзе flag = false; // правило для этого договора есть на шлюзе if ( options.openRulesFrom.containsKey( ruleOptions.fromPos ) ) { // если правило есть а юзер заблокирован - удаляем правило if ( status.status > 0 ) { if( options != null ) { rules = options.openRulesFrom.get( ruleOptions.fromPos ); if( rules != null ) { for( int rule : rules ) { options.commands.add( "no " + rule ); } } } } flag = true; options.openRulesFrom.remove( ruleOptions.fromPos ); } // правила нет, а юзер открыт - добавляем правило if ( !flag && status.status == IPNContractStatus.STATUS_OPEN ) { rule = CiscoRuleOptions.clearFromParams( status.rule.getRuleText() ); acl = aclMap.get( ruleOptions.aclId ); if( acl != null ) { // типизированное правило if( status.ruleType != null ) { String ruleText = ManadUtils.getRule( status.gateType, status.ruleType ); rule = ManadUtils.generateRule( ruleText, rule, null, status.ruleType ); //ipPattern = Pattern.compile( "access list\\s+([\\w\\-]+)" ); } int rulePos = ruleOptions.fromPos; StringTokenizer st = new StringTokenizer( rule, "\r\n" ); while( st.hasMoreTokens() ) { String line = st.nextToken().trim(); acl.commands.add( (rulePos++) + " " + line ); } } } } } markOpenFromRules( String result, aclByNameMap ) { gid = gate.getId(); line = null; currentAclOptions = null; st = new StringTokenizer( result, "\r\n" ); accessPattern = Pattern.compile( "access list\\s+([\\w\\-]+)" ); rulePattern = Pattern.compile( "^(\\d+)\\s+((permit)|(deny))" ); while( st.hasMoreTokens() ) { line = st.nextToken().trim(); m = accessPattern.matcher( line ); if( m.find() ) { currentAcl = m.group( 1 ); currentAclOptions = aclByNameMap.get( currentAcl ); if( log.isDebugEnabled() ) { log.debug( gid + " ACL " + currentAcl + " not in billing control.." ); } continue; } if( currentAclOptions == null ) { continue; } m = rulePattern.matcher( line ); if( m.find() ) { rule = Utils.parseIntString( m.group( 1 ) ); if( rule < currentAclOptions.fromPos || rule > currentAclOptions.toPos ) { if( log.isDebugEnabled() ) { log.debug( gid + " Skip rule " + line ); } } else { ruleFrom = ((rule - currentAclOptions.fromPos) / currentAclOptions.onContact) * currentAclOptions.onContact + currentAclOptions.fromPos; rules = currentAclOptions.openRulesFrom.get( ruleFrom ); if( rules == null ) { rules = new HashSet(); currentAclOptions.openRulesFrom.put( ruleFrom, rules ); } rules.add( rule ); if( log.isDebugEnabled() ) { log.debug( gid + " Contact open from rule: " + ruleFrom ); } } } } } Нужна библиотечка commons-net.jar в каталоге lib И это работает с моей кошкой! |
Автор: | stark [ 12 май 2009, 17:34 ] |
Заголовок сообщения: | |
Основное отличие в том , что вы просто не ждете прихода послденего символа , и перестаете ждать после timeout ..Того же эффекта можно добится если в 4.6 сделать setTimeout у TelnetSession |
Автор: | msh [ 06 июн 2009, 01:37 ] |
Заголовок сообщения: | |
stark писал(а): Основное отличие в том , что вы просто не ждете прихода послденего символа , и перестаете ждать после timeout ..Того же эффекта можно добится если в 4.6 сделать setTimeout у TelnetSession
там timeout 400 секунд при правильной работе скрипта он никогда не случается. естественно последнего символа ждать не нужно - его просто не существует, как нашли нужный шаблон значит можно слать следующую каманду |
Автор: | stark [ 18 авг 2009, 10:56 ] |
Заголовок сообщения: | |
сделал новое api . bitel.billing.server.util.telnet.ansi.TelnetAnsiSession http://bgbilling.ru/forum/viewtopic.php?t=2196&start=60 не должно зависать |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |