Плагин lists.spf [15/08/2013 21:40]

Обсуждение программ nnCron и nnCron LITE

Re: Плагин lists.spf

Postby VoidVolker » Fri, 25 Nov 2011, 23:54

О, что-то интересное, сразу на вскидку:
Moriturus wrote:S" %bln COUNT%" EVAL-SUBST

Заменяется на:
Code: Select all
bln COUNT

Кстати, попробуй плагин Autostrings.spf - думаю тут он придется кстати. Завтра погляжу лучше - а то сейчас уже спать пора.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Morituruz » Sat, 26 Nov 2011, 00:26

VoidVolker wrote:О, что-то интересное, сразу на вскидку:
Moriturus wrote:S" %bln COUNT%" EVAL-SUBST

Заменяется на:
Code: Select all
bln COUNT


да я знаю, но внутри do loop или где-то ещё почему-то не работало.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Sat, 26 Nov 2011, 09:26

Moriturus wrote:да я знаю, но внутри do loop или где-то ещё почему-то не работало.

Значит это было ошибка где-то.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Morituruz » Sat, 26 Nov 2011, 10:44

Вот тут не работает:
Code: Select all
      bln COUNT S" /%NVAL%.+%PERCENT%(\r\n)|($)/i" EVAL-SUBST RE-ALL
         bln S" %bln COUNT%" EVAL-SUBST $0 S" ? " $0 S+ StringReplace2
      ;RE-ALL
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Sat, 26 Nov 2011, 10:49

А что за StringReplace2? Он по PLACE что ли сохраняет строку? И что именно не работает в данном коде? Просто надо локализовать проблему до слова, которое эту проблему вызывает.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Morituruz » Sat, 26 Nov 2011, 11:03

Оно из хелпа:
http://nncron.ru/help/RU/add_info/forth ... #str_works
Code: Select all
: StringReplace2 { a2 a1 u1 a3 u3 a4 u4 \ rest -- a2 u2 }
  a2 0!
  a1 u1
  BEGIN OVER SWAP a3 u3 SEARCH WHILE
  TO rest SWAP 2DUP - a2 +PLACE
  a4 u4 a2 +PLACE
  rest u3 /STRING
  REPEAT
  a2 +PLACE
  DROP 
;
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Sat, 26 Nov 2011, 11:11

А точно, вспомнил. На счет кода: явно лишний bln в начале, плюс RE-ALL - это цикл, так что после его работы на стеке либо ничего не останется (ни одного совпадения), либо будет куча строк от StringReplace2. Так что тут ошибка не в COUNT, а в том, что код некорректный в целом.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Morituruz » Sat, 26 Nov 2011, 11:40

Извините, не понял, а как надо тогда? Если бы на стеке оставалось что-нибудь, ннкрон ругался бы, нет?
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Sat, 26 Nov 2011, 11:54

Moriturus wrote:Извините, не понял, а как надо тогда? Если бы на стеке оставалось что-нибудь, ннкрон ругался бы, нет?

Зависит от того, что надо сделать. Насколько я понял, надо в массиве заменить некоторые строки? Для этого уже давно есть вот такое удобное слово:
Code: Select all
: StringReplace { a1 u1 a2 u2  a3 u3 \ rest a4 u4 buf -- a u }  \ Заменить в строке 1 подстроку 2 на строку 3, на стеке останется измененая строка
  AT buf TO a4
  a1 u1
  BEGIN OVER SWAP a2 u2 SEARCH WHILE
    TO rest SWAP 2DUP - a4 u4 2SWAP S+ TO u4 TO a4
    a3 u3 a4 u4 2SWAP S+ TO u4 TO a4
    rest u2 /STRING
  REPEAT
  a4 u4 2SWAP S+
  ROT DROP
;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Morituruz » Sat, 26 Nov 2011, 12:26

Вы как всегда правы, я RE-ALL зря привлёк, можно и просто заменить, но всё равно почему-то так работает:
Code: Select all
         bln S" %bln COUNT%" EVAL-SUBST host_name S" ? " host_name S+ StringReplace2

а так нет:
Code: Select all
         bln bln COUNT host_name S" ? " host_name S+ StringReplace2

а с вашим реплейсом всё ок:
Code: Select all
bln COUNT host_name S" ? " host_name S+ StringReplace bln PLACE
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Sat, 26 Nov 2011, 12:33

Moriturus wrote:Вы как всегда правы, я RE-ALL зря привлёк, можно и просто заменить, но всё равно почему-то так работает:
Code: Select all
         bln S" %bln COUNT%" EVAL-SUBST host_name S" ? " host_name S+ StringReplace2

а так нет:
Code: Select all
         bln bln COUNT host_name S" ? " host_name S+ StringReplace2

а с вашим реплейсом всё ок:
Code: Select all
bln COUNT host_name S" ? " host_name S+ StringReplace bln PLACE

Воот, значит виноват StringReplace2. Вероятно проблема в том, что для сохранения используется источник, думаю если вместо первого bln поставить другой пустой массив, то вероятно заработает как надо.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Morituruz » Sat, 26 Nov 2011, 13:52

а я-то привык доверять словам из справки.
Для полного счастья мне только не хватает пинга с настраиваемым временем ожидания и учётом потерь. Спрашивал об этом здесь:
viewtopic.php?f=5&t=1706
VoidVolker, можете как-то помочь?
Собственно, главное это задаваемое время ожидания ответа от хоста, т.к. оно слишком велико.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby VoidVolker » Sat, 26 Nov 2011, 14:14

Moriturus wrote:Для полного счастья мне только не хватает пинга с настраиваемым временем ожидания и учётом потерь.

Справочная система nnCron > Ключевые слова nnCron > Работа с удаленным доступом и интернет-ресурсами > HOST-EXIST
По умолчанию, интернет-ресурс пингуется с тайм-аутом в 3000 мс. Собственный тайм-аут вы можете установить, изменив значение VALUE-переменной PING-TIMEOUT.
Code: Select all
5000 TO PING-TIMEOUT
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Плагин lists.spf

Postby Morituruz » Sat, 26 Nov 2011, 14:17

Это слово повлияет на все HOST-EXIST в кронтабах, локально для задачи нельзя?
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Плагин lists.spf

Postby Morituruz » Sat, 03 Dec 2011, 19:57

Не могу понять, в чём дело.
Текст задачи:
Code: Select all

#( Ping_hosts
SingleInstance
HyperActive
Time: */5  * * * * *
Rule: ONLINE? aston_fail_flag = ;

STRING-LIST: hosts
CREATE bln 256 ALLOT
VARIABLE ping_icon_id
VARIABLE ping_tray_icon
\ задержка до хоста:
0 VALUE ping_time
\ потери до хоста:
0 VALUE ping_loss
\ флаг индикации проблем:
VARIABLE bad?
\ пауза между пингами
500 VALUE ping_timeout

\ слова для получения соотв. значений:
: host_name NVAL ;
: host_ip S" ip" INI-GET-VALUE ;
: host_loss S" loss" INI-GET-VALUE S>NUM ;
: host_time S" time" INI-GET-VALUE S>NUM ;
: host_number S" number" INI-GET-VALUE 2DUP S" default value" COMPARE 0<>
IF
   S>NUM
ELSE
   2DROP
   \ значение по умолчанию:
   50
THEN
;

: ping2 ( a u -- ?)
    { \ ip h ipi req echo -- ?}
    GetHostIP THROW TO ip
    IcmpCreateFile DUP INVALID_HANDLE_VALUE =
    IF DROP
        GetLastError THROW
    THEN
    TO h
    /IPINFO TEMP-ALLOC TO ipi
    /ICMPECHO PING-BUF-LEN + TEMP-ALLOC TO echo
    PING-BUF-LEN TEMP-ALLOC TO req
    PING-TTL ipi ipTtl C!
    PING-TTL ipi ipTos C!
   
    PING-LEN 0 DO I 32 + req I + C! LOOP
   
    -1 TO PING-RES
       PING-TIMEOUT PING-BUF-LEN echo
       ipi
       PING-LEN  req
       ip  h IcmpSendEcho
       IF
          echo icmpStatus @ DUP TO PING-RES 0=
          IF
              h IcmpCloseHandle DROP
              echo icmpRTTime @
              EXIT
          THEN
       THEN
    h IcmpCloseHandle DROP
    ping_loss 1+ TO ping_loss
    FALSE
;
: (PING2) ( addr u -- ?)
    WITH Socket
         ?INIT
         ['] ping2 CATCH
         ?CLEAN
     ENDWITH
     THROW
;

: PING2 ['] (PING2) CATCH ?DUP
    IF 2DROP DROP 0 THEN
;

Action:
S" action" EVAL-SUBST CRON-LOG
S" .\ping.ini" INI-FILENAME

\ секции:
S" line" EVAL-SUBST CRON-LOG
S" DNS" hosts!
S" Google" hosts!
S" norm" hosts!

\ все ли необходимые параметры в ini файле присутствуют:
S" line" EVAL-SUBST CRON-LOG
hosts(
S" line" EVAL-SUBST CRON-LOG
   host_name INI-SECTION
S" line" EVAL-SUBST CRON-LOG
   S" ip" INI-GET-VALUE S" default value" COMPARE 0=
S" line" EVAL-SUBST CRON-LOG
   S" time" INI-GET-VALUE S" default value" COMPARE 0=
S" line" EVAL-SUBST CRON-LOG
   S" loss" INI-GET-VALUE S" default value" COMPARE 0=
S" line" EVAL-SUBST CRON-LOG
   OR OR
   IF
      48 S" Ping" DROP S" Отсутствует параметр в секции %host_name%" EVAL-SUBST DROP 0 MessageBoxA DROP
      EXIT
   THEN
)hosts

S" line" EVAL-SUBST CRON-LOG
S" " bln PLACE
\ заполняем строку названиями хостов:
hosts(
   CRLF host_name S+ S" : 0 ms, 0 %" S+ bln +PLACE
)hosts

\ отрезаем первый перенос:
bln COUNT 2 /STRING bln PLACE

S" line" EVAL-SUBST CRON-LOG
32516 ping_tray_icon !
500 TO PING-TIMEOUT

\ вешаем иконочку
S" line" EVAL-SUBST CRON-LOG
bln COUNT ping_tray_icon @ 0 LoadIconA ADD-TI ping_icon_id !

BEGIN
   bad? OFF
   hosts(
      host_name INI-SECTION
      S" start ping %host_name%" EVAL-SUBST CRON-LOG
      \ проверка на наличие всех необходимых параметров
      S" ip" INI-GET-VALUE S" default value" COMPARE 0=
      S" line %host_name%" EVAL-SUBST CRON-LOG
      S" time" INI-GET-VALUE S" default value" COMPARE 0=
      S" line %host_name%" EVAL-SUBST CRON-LOG
      S" loss" INI-GET-VALUE S" default value" COMPARE 0=
      OR OR
      S" line %host_name%" EVAL-SUBST CRON-LOG
      IF
         48 S" Ping" DROP S" Отсутствует параметр в секции %host_name%" EVAL-SUBST DROP 0 MessageBoxA DROP
         EXIT
      THEN
      S" line %host_name%" EVAL-SUBST CRON-LOG
      0 TO ping_loss
      S" line %host_name%" EVAL-SUBST CRON-LOG
      0 TO ping_time
      S" line %host_name%" EVAL-SUBST CRON-LOG
      \ подставляем знак вопроса в пингуемое в данный момент соединение:
      S" line %host_name%" EVAL-SUBST CRON-LOG
      bln COUNT host_name S" ? " host_name S+ StringReplace bln PLACE
      S" line %host_name%" EVAL-SUBST CRON-LOG
      bln COUNT ping_tray_icon @ 0 LoadIconA ping_icon_id @ MODIFY-TI
      \ пингуем
      S" line %host_name%" EVAL-SUBST CRON-LOG
      host_number 0 DO
         host_ip PING2 ping_time + TO ping_time
         ping_timeout PAUSE
      LOOP
      S" line %host_name%" EVAL-SUBST CRON-LOG
      \ пересчитываем потери и время в расчёте на кол-во пингов:
      S" line %host_name%" EVAL-SUBST CRON-LOG
      ping_time host_number / TO ping_time
      ping_loss 100 * host_number / TO ping_loss
      \ записываем в лог:
      S" line %host_name%" EVAL-SUBST CRON-LOG
      FILE-APPEND: "g:\%host_name%_ping.log" "%YY%.%MM%.%DD% %hh%:%mm%:%ss% %host_name%: %ping_time% ms, %ping_loss% %PERCENT%%crlf%"
      \ обновляем значение пинга и потерь:
      S" line %host_name%" EVAL-SUBST CRON-LOG
      bln COUNT S" /%host_name%.+/i" EVAL-SUBST RE-ALL
      S" line %host_name%" EVAL-SUBST CRON-LOG
         bln COUNT $0 S" %host_name%: %ping_time% ms, %ping_loss% %PERCENT%" EVAL-SUBST StringReplace bln PLACE
      ;RE-ALL
      \ убираем знак вопроса:
      S" line %host_name%" EVAL-SUBST CRON-LOG
      bln COUNT S" ? " S" " StringReplace bln PLACE
      S" line %host_name%" EVAL-SUBST CRON-LOG
      bln COUNT ping_tray_icon @ 0 LoadIconA ping_icon_id @ MODIFY-TI

      \ сравниваем потери и время отклика с допустимыми:
      host_time ping_time <
      host_loss ping_loss <
      OR
      IF
      S" line %host_name%" EVAL-SUBST CRON-LOG
         bad? ON
      THEN
   )hosts
      S" line" EVAL-SUBST CRON-LOG
   bad? @
   IF
      S" line" EVAL-SUBST CRON-LOG
      32515 ping_tray_icon !
   ELSE
      S" line" EVAL-SUBST CRON-LOG
      32516 ping_tray_icon !
   THEN
      S" line" EVAL-SUBST CRON-LOG
   bln COUNT ping_tray_icon @ 0 LoadIconA ping_icon_id @ MODIFY-TI
      S" line" EVAL-SUBST CRON-LOG
   ASSUMED-NEXT-TIME
   IF
      S" line" EVAL-SUBST CRON-LOG
      FT-CUR FT- FT>MS D>S PAUSE
   THEN
      S" line" EVAL-SUBST CRON-LOG
   ONLINE? aston_fail_flag <>
UNTIL
      S" exit" EVAL-SUBST CRON-LOG
2000 PAUSE
)#



Периодически выдаёт ошибку, примеры из лога:

Code: Select all
01 Dec 08:05:51 10768 line norm
01 Dec 08:05:59 10768 line norm
01 Dec 08:05:59 10768 line norm
01 Dec 08:05:59 10768 line norm
01 Dec 08:05:59 10768 line norm
01 Dec 08:05:59 10768 line norm
01 Dec 08:05:59 10768 line norm
01 Dec 08:05:59 10768 line norm
01 Dec 08:05:59 10768 line
01 Dec 08:05:59 10768 line
01 Dec 08:05:59 10768 line
01 Dec 08:05:59 10768 line
01 Dec 08:05:59 10768 line
01 Dec 08:09:25 5012 nnCron is resumed
01 Dec 08:09:25 10916 TASK: Disconnect
01 Dec 08:09:25 10916 RAS: no errors.
01 Dec 19:16:01 10768 line
01 Dec 19:16:01 10768 exit
01 Dec 19:16:11 10868 TASK: Connect
01 Dec 19:20:00 10312 TASK: Ping_hosts
01 Dec 19:20:00 10312 action
01 Dec 19:20:00 10312 line
01 Dec 19:20:08 10312 Ping_hosts: Внутренняя ошибка. Error # -1073741819

...
03 Dec 15:51:22 10124 exit
03 Dec 15:51:32 13428 TASK: Connect
03 Dec 15:55:00 13184 TASK: Ping_hosts
03 Dec 15:55:00 13184 action
03 Dec 15:55:00 13184 line
03 Dec 15:55:12 13184 Ping_hosts: Внутренняя ошибка. Error # -1073741819



Вобщем как правило такое происходит во время подключения после возвращения из спящего режима (POWER-HIBERNATE).
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 4 guests