< -->

Program Modem_Sessions_Shower;
{$D+,E-,N+,G+}
type
  Ttar = record
    _08_18_ : Extended;
    _18_00_ : Extended;
    _00_08_ : Extended;
    _holid_ : Extended;
  end;
var
  f, fr : Text;
  S, S1 : String;
  fname : String;
  ModemName : String;
  Dolr_Rub  : Extended;
  TarifZ : Ttar;
  Connect_Ok, Inet_Ok : Boolean;
  NCount, NCount_Ok, NCount_Inet : Longint;
  CurBytesRead, CurBytesWrite, BytesRead, BytesWrite, AllBytesRead, AllBytesWrite : Longint;
  TimeCon, TimeHang, InetTime, SumTime : Extended;
  Hours : Word;
  Minutes, Secunds: Extended;
  Money, MoneyRight : Extended;
  Code : Integer;
const
  begSession = ' in use.';
  endSession = ' closed';
  SessStat   = 'Session Statistics:';
  Connect    = 'Connection established at ';
  HangUp     = 'Hanging up the modem.';
  Reads      = 'Reads :';
  Writes     = 'Writes:';
  configfile = 'modemss.cfg';
  Outfile : String = 'modem.nfo';{default}
Function UpString(Sra : String) : String;
var
 i : Byte;
 Sr : String;
begin
  Sr := Sra;
  for i := 1 to Length(Sr) do
    Sr[i] := UpCase(Sr[i]);
  UpString := Sr
end;
Procedure ShowNFO;
begin
   WriteLn('Формат файла:');
   WriteLn('Первая строка - имя модема, каким оно пишется в логе (ТОЧНОЕ!)');
   WriteLn('Вторая строка - имя файла для вывода информации (если пустая - вывод будет');
   WriteLn('производиться в файл ',  Outfile);
   WriteLn('Третья строка - соотношение руб./долл.');
   WriteLn('Четвёртая - седьмая строки - тарифы:');
   WriteLn('будни: 4\8ч.-18ч.; 5\18ч.-0ч.; 6\0ч.-8ч.; 7\выходные и праздники в любое время.');
end;
Function RusDate(xS : String) : String;
begin
  RusDate := Copy(xS, Pos('-', S)+1, 3)+Copy(xS, 1, Pos('-', S))+Copy(xS, Pos('-', S)+4, 4);
end;
begin
  CurBytesRead := 0;
  CurBytesWrite := 0;
  BytesRead := 0;
  BytesWrite := 0;
  AllBytesRead := 0;
  AllBytesWrite := 0;
  TimeCon := 0;
  TimeHang := 0;
  InetTime := 0;
  SumTime := 0;
  Dolr_Rub := 0;
  NCount := 0;
  NCount_Ok := 0;
  NCount_Inet := 0;
  Money := 0;
  MoneyRight := 0;
  with TarifZ do
  begin
   _08_18_ := 0;
   _18_00_ := 0;
   _00_08_ := 0;
   _holid_ := 0;
  end;
  Connect_Ok := False;
  Inet_Ok := False;
  WriteLn('================================================');
  if ParamCount<1 then
  begin
    WriteLn('Modem''s Sessions Shower-Convertor');
    WriteLn(' Укажите имя файла, содержащего ЛОГ работы модема');
    Halt($FFFF);
  end;
  {$I-}
  Assign(f, configfile);
  Reset(f);
  {$I+}
  if IOResult<>0 then
  begin
    WriteLn('Не найден файл конфигурации ', configfile);
    ShowNFO;
    Halt;
  end;
  ReadLn(f, ModemName);
  ReadLn(f, S);
  ReadLn(f, Dolr_Rub);
  ReadLn(f, tarifZ._08_18_);
  ReadLn(f, tarifZ._18_00_);
  ReadLn(f, tarifZ._00_08_);
  ReadLn(f, tarifZ._holid_);
  Close(f);
  if ModemName='' then
  begin
    WriteLn('Отсутствует название модема в файле конфигурации ', configfile,' !');
    ShowNFO;
    Halt;
  end;
  if (Dolr_Rub=0) or (tarifZ._08_18_=0) or (tarifZ._18_00_=0) or
    (tarifZ._00_08_=0) or (tarifZ._holid_=0) then
  begin
    WriteLn('Отсутствует описание для тарифов Инета в файле конфигурации ', configfile, '!');
    ShowNFO;
    Halt;
  end;
  if S<>'' then OutFile := S;
  WriteLn('Файл конфигурации успешно прочитан.');
  WriteLn('Имя модема: ', ModemName);
  WriteLn('Вывод производится в файл ', OutFile);
  fname := ParamStr(1);
  WriteLn('Обрабатывается файл '+fname);
  WriteLn('================================================');
  WriteLn('Руб./долл.: ', Dolr_Rub:1:2);
  WriteLn('Тариф 8ч.  - 18ч.: $', tarifZ._08_18_:1:3, ' = ', Dolr_Rub*tarifZ._08_18_:1:2, ' руб./минуту');
  WriteLn('Тариф 18ч. - 0ч. : $', tarifZ._18_00_:1:3, ' = ', Dolr_Rub*tarifZ._18_00_:1:2, ' руб./минуту');
  WriteLn('Тариф  0ч. - 8ч. : $', tarifZ._00_08_:1:3, ' = ', Dolr_Rub*tarifZ._00_08_:1:2, ' руб./минуту');
  WriteLn('Тариф выходные и праздники: $', tarifZ._holid_:1:3, ' = ', Dolr_Rub*tarifZ._holid_:1:2, ' руб./минуту');
  WriteLn('================================================');
  Assign(f, fname);
  Assign(fr, outfile);
  Reset(f);
  Rewrite(fr);

  WriteLn(fr, '-=Список дозвона в Инет=-');
  WriteLn(fr, '================================================');
  WriteLn(fr, 'Имя модема: ', ModemName);
  WriteLn(fr, 'Обрабатывается файл '+fname);
  WriteLn(fr, 'Руб./долл.: ', Dolr_Rub:1:2);
  WriteLn(fr, 'Тариф 8ч.  - 18ч.: $', tarifZ._08_18_:1:3, ' = ', Dolr_Rub*tarifZ._08_18_:1:2, ' руб./минуту');
  WriteLn(fr, 'Тариф 18ч. - 0ч. : $', tarifZ._18_00_:1:3, ' = ', Dolr_Rub*tarifZ._18_00_:1:2, ' руб./минуту');
  WriteLn(fr, 'Тариф  0ч. - 8ч. : $', tarifZ._00_08_:1:3, ' = ', Dolr_Rub*tarifZ._00_08_:1:2, ' руб./минуту');
  WriteLn(fr, 'Тариф выходные и праздники: $', tarifZ._holid_:1:3, ' = ', Dolr_Rub*tarifZ._holid_:1:2, ' руб./минуту');
  WriteLn(fr);
  While not EOF(f) do
  begin
    ReadLn(f, S);
    if Pos(begSession, S)<>0 then
    begin
      WriteLn(fr, '================================================');
      Connect_Ok := False;
      Inet_Ok := False;
      WriteLn(fr, 'Дата дозвона: ', RusDate(Copy(S, 1, Pos(' ', S)-1)));
      S1 := Copy(S, Pos(' ', S)+1, 11);
      WriteLn(fr, 'Время начала дозвона: ', S1);
      inc(NCount);
    end;
    if Pos(Connect, S)<>0 then
    begin
      Inet_Ok := False;
      Connect_Ok := True;
      S1 := Copy(S, Pos(' ', S)+1, 11);
      Val(Copy(S1, 1, 2), Hours, Code);
      Val(Copy(S1, 4, 2), Minutes, Code);
      Val(Copy(S1, 7, 5), Secunds, Code);
      TimeCon := Minutes+60.0*Hours+Secunds/60;
      WriteLn(fr, 'Время начала соединения: ', S1);
      Delete(S, 1, Pos('at', S)+2);
      WriteLn(fr, 'Скорость соединения: ', Copy(S, 1, Pos('.', S)));
      inc(NCount_Ok);
    end;
    if Pos(HangUp, S)<>0 then
    begin
      S1 := Copy(S, Pos(' ', S)+1, 11);
      Val(Copy(S1, 1, 2), Hours, Code);
      Val(Copy(S1, 4, 2), Minutes, Code);
      Val(Copy(S1, 7, 5), Secunds, Code);
      TimeHang := Minutes+60.0*Hours+Secunds/60;
      if Connect_Ok then
      begin
       if (TimeHang-TimeCon)<0 then
       begin
         TimeHang := TimeHang+60.0*24.0;
         SumTime := SumTime + (TimeHang-TimeCon)
       end
       else
         SumTime := SumTime + (TimeHang-TimeCon);
       if (TimeHang-TimeCon) >= 160 then
       begin
         InetTime := InetTime + (TimeHang-TimeCon);
         Inet_Ok := True;
       end;
      end;
      WriteLn(fr, 'Время окончания соединения: ', S1);
      Hours := Round((TimeHang-TimeCon)/60);
      Minutes := int(TimeHang - TimeCon - int((TimeHang-TimeCon)/60)*60);
      Secunds := (TimeHang - TimeCon - int((TimeHang-TimeCon)/60)*60)*60-Minutes*60.0;
      if Connect_Ok then
        WriteLn(fr, 'Время соединения: ', Hours, ' ч. ', Minutes:1:0, ' мин. ',Secunds:1:2, ' сек.');
      Connect_Ok := False;
    end;
    if Pos(SessStat, S)<>0 then
    begin
      WriteLn(fr, '/\/\/|:===--->>> Итоги <<<---===:|\/\/\');
      ReadLn(f, S);
      Delete(S, 1, Pos(Reads, S)+7);
      Delete(S, Pos(' ', S), 6);
      Val(S, CurBytesRead, Code);
      WriteLn(fr, 'Получено байт:   ', S);
      ReadLn(f, S);
      Delete(S, 1, Pos(Writes, S)+7);
      Delete(S, Pos(' ', S), 6);
      Val(S, CurBytesWrite, Code);
      WriteLn(fr, 'Отправлено байт: ', S);
      AllBytesRead := AllBytesRead + CurBytesRead;
      AllBytesWrite := AllBytesWrite + CurBytesWrite;
      if Inet_Ok then
      begin
        BytesRead := BytesRead + CurBytesRead;
        BytesWrite := BytesWrite + CurBytesWrite;
        inc(NCount_Inet);
      end;
    end;
  end;
  WriteLn(fr);
  WriteLn(fr, '######################');
  WriteLn(fr, '-=/\| Статистика |\/=-');
  WriteLn(fr, '######################');
  WriteLn(fr);
  WriteLn(fr, 'Попыток соединения: ', NCount);
  WriteLn(fr, 'Удачных соединений: ', NCount_Ok);
  WriteLn(fr, 'Удачных выходов в Инет: ', NCount_Inet);
  WriteLn(fr);
  WriteLn(fr, 'Получено байт за все сеансы связи:   ', AllBytesRead);
  WriteLn(fr, 'Отправлено байт за все сеансы связи: ', AllBytesWrite);
  WriteLn(fr, 'Всего времени за все сеансы: ', SumTime:1:2, ' минут');
  WriteLn(fr);
  WriteLn(fr, 'Получено байт за сеансы подключения к Инету:   ', BytesRead);
  WriteLn(fr, 'Отправлено байт за сеансы подключения к Инету: ', BytesWrite);
  WriteLn(fr, 'Время в Инете: ', InetTime:1:2, ' минут');
  WriteLn(fr, 'На сумму (не учтены переходы между тарифами): ', Money:1:2, ' рублей');
  WriteLn(fr, 'На сумму (учтены переходы между тарифами для разного времени): ', MoneyRight:1:2, ' рублей');
  Close(fr);
  Close(f);
end.

Назад