BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 10 июл 2025, 02:15

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




Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
СообщениеДобавлено: 02 май 2009, 18:16 
Имеется следующий скрипт по управлению шлюзом 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


Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: 04 май 2009, 18:16 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
попробуйте сменить "session.setLoginPromptSequence( "name:" );" на
"session.setLoginPromptSequence( ":" );"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 04 май 2009, 18:24 
Не в сети
Разработчик

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 04 май 2009, 19:46 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
dlink нормально работает, проверили


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 04 май 2009, 20:39 
stark писал(а):
попробуйте сменить "session.setLoginPromptSequence( "name:" );" на
"session.setLoginPromptSequence( ":" );"


так там же в баннере присутствует символ ":" после слова firmware
что приводит иногда к досрочному выходу из функции ожидания


Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: 04 май 2009, 20:40 
stark писал(а):
dlink нормально работает, проверили

сколько раз проверяли?- проблема носит случайных характер
dlink c такой же прошивкой?
там кстати timeout в методе connect и doCommand не предусиотрены?


Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: 05 май 2009, 13:15 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
msh писал(а):
stark писал(а):
dlink нормально работает, проверили

сколько раз проверяли?- проблема носит случайных характер
dlink c такой же прошивкой?

есть целый город с железками - des-3526, 3550, 3852, 3828, 3028, dgs-3200-10 . Я понаблюдаю

msh писал(а):
там кстати timeout в методе connect и doCommand не предусиотрены?

да., но только в версии 4.6 ставится timeout у сессии ..в 4.5 нет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 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;  
}


Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 май 2009, 10:04 
Не в сети

Зарегистрирован: 19 янв 2009, 15:15
Сообщения: 85
Карма: 0
msh писал(а):
написал свой класс аналогичный TelnetSession
при его использовании зависания не выявлены
ищите ошибку ;)


Подскажи, как твой класс подсунуть вместо штатного? Возможно мне он тоже поможет в моей проблеме.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 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;


Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: 07 май 2009, 22:35 
Не в сети

Зарегистрирован: 19 янв 2009, 15:15
Сообщения: 85
Карма: 0
Мда... Не работает, т.к. нет полной реализации протокола Telnet
Циска запрашивает параметры терминала, а твой класс на такое отвечать не умеет... вот и висим... (какой-то навороченный телнет у моей циски, слишком умный)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 08 май 2009, 00:49 
Heggi писал(а):
Мда... Не работает, т.к. нет полной реализации протокола Telnet
Циска запрашивает параметры терминала, а твой класс на такое отвечать не умеет... вот и висим... (какой-то навороченный телнет у моей циски, слишком умный)

что-то очень замудреная циска
на нее даже netcat -ом зайти не получается?
вроде по стандарту телнет находится в режиме приема данных и если на команду ничего не отвечать то удаленная сторона должна понять что данная комадна не поддерживается. ну можно на все запросы отвечать что опция не поддерживается


Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: 08 май 2009, 01:00 
Не в сети

Зарегистрирован: 19 янв 2009, 15:15
Сообщения: 85
Карма: 0
Кто причешет в божеский вид - скажу большое спасибо... У меня уже крыша едет от жабы -)

Код:
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


И это работает с моей кошкой!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 май 2009, 17:34 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
Основное отличие в том , что вы просто не ждете прихода послденего символа , и перестаете ждать после timeout ..Того же эффекта можно добится если в 4.6 сделать setTimeout у TelnetSession


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 06 июн 2009, 01:37 
stark писал(а):
Основное отличие в том , что вы просто не ждете прихода послденего символа , и перестаете ждать после timeout ..Того же эффекта можно добится если в 4.6 сделать setTimeout у TelnetSession


там timeout 400 секунд при правильной работе скрипта он никогда не случается.
естественно последнего символа ждать не нужно - его просто не существует, как нашли нужный шаблон значит можно слать следующую каманду


Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: 18 авг 2009, 10:56 
Не в сети
Разработчик

Зарегистрирован: 08 ноя 2007, 01:05
Сообщения: 8343
Откуда: Уфа
Карма: 238
сделал новое api . bitel.billing.server.util.telnet.ansi.TelnetAnsiSession
http://bgbilling.ru/forum/viewtopic.php?t=2196&start=60
не должно зависать


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

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


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

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


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

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