Как создать таймер обратного отсчета в DCL - OpenVMS

Я написал скрипт, который будет отправлять OTP (одноразовый пароль) пользователям Mail ID. Поэтому всякий раз, когда система отправляет OTP пользователю, я хочу запустить таймер обратного отсчета на 1 минуту. Но я не уверен, как запустить таймер обратного отсчета с помощью сценариев DCL. Любая идея?

Ниже приведен сценарий, который я использую для создания одноразового пароля. Но мне нужен таймер обратного отсчета... Можно ли отображать обратный отсчет на экране? Пожалуйста помоги !!

$! RAND - returns a positive random number ("RANDOM") between 0 and 
$!        __CEIL - 1. 
$! sharris-at-sdsdmvax.fb3.noaa.gov 
$ RAND: 
$ 
$ IF F$TYPE(__SEED) .EQS. "" 
$ THEN 
$     ! seed the random number generator, ... 
$     __NOW = F$CVTIME() 
$     __HOUR = 'F$EXTRACT(11,2,__NOW)' 
$     __MINUTE = 'F$EXTRACT(14,2,__NOW)' 
$     __SECOND = 'F$EXTRACT(17,2,__NOW)' 
$     __TICK = 'F$EXTRACT(20,2,__NOW)' 
$ 
$     __SEED == __TICK + (100 * __SECOND) + (6000 * __MINUTE) + - 
         (360000 * __HOUR) 
$     ! the generator tends to do better with a large, odd seed, ... 
$     __SEED == (__SEED .OR. 1) 
$     ! clean up, ... 
$     DELETEX/SYMBOL __NOW 
$     DELETEX/SYMBOL __HOUR 
$     DELETEX/SYMBOL __MINUTE 
$     DELETEX/SYMBOL __SECOND 
$     DELETEX/SYMBOL __TICK 
$ ENDIF 
$ 
$ IF F$TYPE(__CEIL) .EQS. "" THEN __CEIL = %X3FFFFFFF 
$ 
$ __SEED == __SEED * 69069 + 1 
$ RANDOM == (__SEED.AND.%X3FFFFFFF)/(%X40000000/__CEIL) 
$ define sys$output MANAGERS:[EMAL]random.txt
$ sh sym RANDOM
$ deassign sys$output
$ sear MANAGERS:[EMAL]random.txt random /out=MANAGERS:[EMAL]random1.txt
$ open in MANAGERS:[EMAL]random1.txt
$ LOOP4:
$ READ/END_OF_FILE=ENDIT4 IN RANDO
$ GOTO LOOP4
$ ENDIT4:
$ close in
$ RANDOM1 = F$EXTRACT(30,8,RANDO)
$ sh sym RANDOM1
$ mail a.txt smtp%"[email protected]" /sub="Your Password is ''RANDOM1' "

когда я запускаю приведенный выше скрипт, мой OTP будет следующим:

Your Password is 1218A57A

person Aksh Akshay    schedule 22.09.2017    source источник
comment
Типичным способом ожидания в DCL является использование WAIT. команда. В этом случае рассчитайте время окончания, например. сейчас + 1 минута, затем используйте цикл на WAIT одну секунду, пока время окончания не будет достигнуто или не превышено. Вы можете отображать оставшееся время в цикле. Обратите внимание, что нет гарантии, что период ожидания будет точным, и в цикле также есть накладные расходы, поэтому он может не выполниться 60 раз, прежде чем истечет желаемая задержка.   -  person HABO    schedule 22.09.2017
comment
Вы можете заменить последнюю строку на: mail a.txt smtp%"[email protected]" /sub="Your Password is ''F$FAO("!8XL",RANDOM)' " и избавиться от всех строк, связанных с файловым вводом-выводом, чтобы, наконец, получить желаемое шестнадцатеричное число в RANDOM1.   -  person user2116290    schedule 23.09.2017


Ответы (1)


Вот базовый цикл DCL, который отображает обратный отсчет. Как говорили другие, это будет не ровно 60 секунд, но я предполагаю, что это не важно.

 $       X = 60
 $ 1$:   WRITE SYS$OUTPUT X, " Seconds"
 $       WAIT 00:00:01.00
 $       X = X - 1
 $       IF X .GT. 0 THEN GOTO 1$
 $

Если это неясно из другого комментария, если вы по какой-то причине не сохраняете пароль в файле random.txt, вы можете упростить последний бит вашего скрипта. Скорее, чем:

 $ define sys$output MANAGERS:[EMAL]random.txt
 $ sh sym RANDOM
 $ deassign sys$output
 $ sear MANAGERS:[EMAL]random.txt random /out=MANAGERS:[EMAL]random1.txt
 $ open in MANAGERS:[EMAL]random1.txt
 $ LOOP4:
 $ READ/END_OF_FILE=ENDIT4 IN RANDO
 $ GOTO LOOP4
 $ ENDIT4:
 $ close in
 $ RANDOM1 = F$EXTRACT(30,8,RANDO)
 $ sh sym RANDOM1
 $ mail a.txt smtp%"[email protected]" /sub="Your Password is ''RANDOM1' "

Вместо:

 $ RANDOM1 = F$FAO("!XL",RANDOM)
 $ mail a.txt smtp%"[email protected]" /sub="Your Password is ''RANDOM1'"
person Mark Diaz    schedule 26.10.2017