Страница 1 из 1

Пример последовательного запуска NLM-ок (perl)

СообщениеДобавлено: 26 сен 2006, 18:22
skoltogyan
Собственно скрипт внизу.
пример trstbcp.cfg
---------------
TRUSTEE.NLM,sys:\system\trustee.nlm /A SAVE DOCUM: DOCUM:trusts\docum.txt,900,20,0
TRUSTEE.NLM,sys:\system\trustee.nlm /A SAVE WORK: DOCUM:trusts\work.txt,900,20,0
TRUSTEE.NLM,sys:\system\trustee.nlm /A SAVE SYS: DOCUM:trusts\sys.txt,900,20,0
REG.NLM,reg save key "\My Server" docum:bcp\grad\registr\daily\backup.reg,10,20,0
DSBK.NLM,dsbk backup -b -f docum:\bcp\grad\edir\daily\edir.dib -l docum:\bcp\grad\edir\daily\edir.log -w -t,10,20,0
TRUSTBAR.NLM,sys:\system\trustbar.nlm DOCUM: -B,900,20,DOCUM:\trustees.xml
TRUSTBAR.NLM,sys:\system\trustbar.nlm SYS: -B,300,20,SYS:\trustees.xml
TRUSTBAR.NLM,sys:\system\trustbar.nlm WORK: -B,900,20,WORK:\trustees.xml
(немного не поместилось - на экране каждая строка заняла 2 :( )
---------------
PERL скрипт берет из файла trstbcp.cfg по строке, запускает, ждет пока
не можуль не выгрузится(завершится) и потом берет следующую строку. Например:
TRUSTBAR.NLM,sys:\system\trustbar.nlm WORK: -B,900,20,WORK:\trustees.xml

До запуска удаляет файл: WORK:\trustees.xml
(если в этом поле (последнем) стоит 0 (ноль), то ничего не удаляется.)
Запускает: sys:\system\trustbar.nlm WORK: -B
Ждет 900 счетов по 20 секунд и если за это время: TRUSTBAR.NLM
все еще запщуен - прекращает скрипт.
В скрипте указано. что журнал работы вести в:
sys:\results\trstbcp\trstbcp.log

Если кому покажется полезным - пользуйтесь.


-----собственно скрипт-----
my $READCONF="sys:\\etc\\1trstbcp\\trstbcp.cfg";

# DEFAULT delay time
my $d_delay=10;

# DEFAULT number of delay times
my $d_numdelay=10;

# DEFAULT Name of the module to check for
my $d_nlm="TEST.NLM";

my $R_NLM=$d_nlm;
my $R_NUMDELAY=$d_delay;
my $R_DELAY=$d_delay;
my $R_COMMAND="E";
my $R_UNLNK;

# The NRM XML file that keeps a note of which modules are loaded
$nrm_file="_admin:/Novell/NRM/NRMModules.xml";

# Quit nicely if this file is discovered.
$stop_file="SYS:TRSTBCP.TXT";

# Where the logs live.
$log_dir="SYS:results\\trstbcp";

# Exit if the log directory's not there.
die "Log folder $log_dir does not exist" if (not -d $log_dir);

# The overall log file. Indicidual job logs will have incremental numbers
$log_file="$log_dir\\trstbcp.log";


mylog (" \n", $log_file);
mylog ("****************************************************", $log_file);
mylog (" START NEW TRUST ", $log_file);

open (FL1, "<$READCONF") || die("Did not Open Source File !!");
mylog ("Read first string from ($READCONF) file", $log_file);


while (not eof(FL1) ) {
$BASESTR="";
$BASESTR=readline(FL1);
@massiv=split(/\,/,$BASESTR);
$R_NLM=$massiv[0];
$R_COMMAND=$massiv[1];
$R_NUMDELAY=$massiv[2];
$R_DELAY=$massiv[3];
$R_UNLNK=0;
$R_UNLNK=$massiv[4];
$R_UNLNK =~ s/\n//g;
if ($R_UNLNK ne "0") {unlink($R_UNLNK);};
mylog ("Start for ($R_COMMAND)", $log_file);
system("$R_COMMAND");
$counttm=0;
sleep($R_DELAY);
while ( get_module_status($R_NLM) != 0)
{
if ($counttm== $R_NUMDELAY) { goto ENDAVR1; };
$counttm=$counttm+1;
sleep($R_DELAY);
}
mylog ("End for ($R_COMMAND)", $log_file);
next;
}
goto END1;
ENDAVR1:
mylog ("ERORRO END for ($R_COMMAND)", $log_file);
mylog ("SCRIPT STOP", $log_file);
END1:
close(FL1);
mylog ("------SCRIPT END--------------------", $log_file);
exit(0);



# -Sub

sub check_stop {
# Check to see whether the 'abort' file exists and exit if it does

if (-e $stop_file) {
mylog("STOP file ($stop_file) exists. Terminating.\n", $log_file);
exit;
}
}

sub mylog {

# log output to screen and (optionally) to file
# $_[0] is the string to be logged, $_[1] is the logfile

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime;

$out=sprintf("%02d",$mday);
$out.="/";
$out.=sprintf("%02d",$mon+1);
$out.="/";
$out.=1900+$year;
$out.=" ";
$out.=sprintf("%02d",$hour);
$out.=":";
$out.=sprintf("%02d",$min);
$out.=":";
$out.=sprintf("%02d",$sec);
$out.=" $_[0]";
$out.="\n";
print $out;
if ($_[1]) {
$LOGFILE=">>" . $_[1];
open LOGFILE or die "Can't open log file $_[1]: $!";
print LOGFILE $out;
close LOGFILE;
}
}


sub get_module_status {

# Check whether a nlm is loaded. Returns 0 if not running, >=1 otherwise
# Relies on NRM XML files
#
# Input: Name of NLM to test (case sensitive)
# Outout: Number of instances found (zero if not found)

# my $COUNT=0;
# my $ETALON=">".$_[0]."<";
# open nrmfile, "<$nrm_file" or die "Unable to open $nrm_file. Is NSS loaded?";
# while (<nrmfile>) {if (/$ETALON/) {++$COUNT}}
# close nrmfile;
# return $COUNT;



my $COUNT=0;
my $ETALON=">".$_[0]."<";
my $ff;
open nrmfile, "<$nrm_file" or die "Unable to open $nrm_file. Is NSS loaded?";
while (<nrmfile>)
{
$ff=<nrmfile>;
while ($ff =~ /$ETALON/g) {++$COUNT;}
}
close nrmfile;
return $COUNT;





}

СообщениеДобавлено: 27 сен 2006, 14:17
Музалёв Николай
Спасибо, очень полезно.
И в порядке Гы-гы...
От имени коллектива неучей имею вопрос: а вставить больше строк комментариев в основных узлах не позволило что? мОцная лянОта? ти агУльная млЯвасть та абыЯкавасть да жиццЯ ?

СообщениеДобавлено: 27 сен 2006, 15:25
Константин Ошмян
Музалёв Николай писал(а):Спасибо, очень полезно.
И в порядке Гы-гы...
Присоединяюсь к предыдущему оратору.

Несколько гы-гы от меня:
  • необходимо дописать в сопроводиловке системные требования (например, на своём NetWare 5.1 я просто не нахожу файла $nrmfile за неимением тома _admin:, на 6.5 такой есть)
  • исправить опечатки (ERORRO END)
  • есть функция check_stop(), проверяющая наличие файла $stop_file; но нет вызовов этой функции.

Оченно пльзительная штукенция!

СообщениеДобавлено: 27 сен 2006, 16:45
Владимир Горяев
Ну..ета в Грабли, чтоль...

эээ

СообщениеДобавлено: 27 сен 2006, 16:54
skoltogyan
Константину Ошмяну , про проверку остановки - оно мне ненадо было и не вставлял. этот скрипт на базе своего другого городил.

Скрипт испольует VFS, для проверки - загружен или нет сейчас данный NLM. Есть-ли это на NW5.1 - не отвечу.

Николаю Музалеву, про гы-гы :):
How configure: у меня конфиг-файл распологается тут:
: sys:\etc\1trstbcp\trstbcp.cfg
и содержит:
***example1:
TRUSTBAR.NLM,sys:\system\trustbar.nlm DOCUM:
-B,900,20,DOCUM:\trustees.xml
where:
[sys:\system\trustbar.nlm DOCUM: -B] - эта коммандная строка. которая будет запускатсья
[TRUSTBAR.NLM] - PERL-Скрипт будет ждать пока модуль TRUSTBAR.NLM не выгрузится.
[20] - задержка в секундах, между проверкой - загружен или нет этот NLM
[900] - количество таких проверок. в данном случае общее время, в течении которого будет проверяться - выгрузился или нет составит:
900 * 20 = 18000 sec
[DOCUM:\trustees.xml] - этот файл будет удален до запуска выше-упомянутой коммандной строки.
Perl скрипт будет ждать 20 * 900 = 18000 sec пока TRUSTBAR.NLM не выгрузится.
Если за это вермя TRUSTBAR.NLM не выгрузится - Perl script прервет свое выполнение.

***example2:
TRUSTEE.NLM,sys:\system\trustee.nlm /A SAVE DOCUM:
DOCUM:trusts\docum.txt,900,20,0
where:
[sys:\system\trustee.nlm /A SAVE DOCUM: DOCUM:trusts\docum.txt] - эта командная строка будет запускатсья
[TRUSTEE.NLM] - PERL script будет ждать, пока этот NLM(TRUSTEE.NLM) не будет выгружен
[20] - задержка в секундах, между проверкой - загружен или нет этот NLM
[900] - количество таких проверок. в данном случае общее время, в течении которого будет проверяться - выгрузился или нет составит:
900 * 20 = 18000 sec
[0] - никакой файл не будет удаляться при запуске командной строки.
Perl script будет ожидать 20 * 900 = 18000 sec пока TRUSTBAR.NLM не будет выгружен
Если TRUSTEE.NLM за это время не выгрузится - Perl script будет прерван.

В TRSTBCP.PL строки:
4: my $READCONF="sys:\\etc\\1trstbcp\\trstbcp.cfg";
Это путь к файлу конфигурации, можно его направить по своему усмотрению

28: $log_dir="SYSDATA:results\\trstbcp";
На томе SYSDATA создан каталог: SYSDATA:\results\trstbcp. Можно по своему усмотрению расположить.

34: $log_file="$log_dir\\trstbcp.log";
В этом каталоге лог-файл SYSDATA:\results\trstbcp\trstbcp.log. Можно по своему усмотрению расположить.

Как запускать :
1. создать файл: sys:\system\trstbcp.ncf с одной строкой:
perl sys:\perl\scripts\my\trstbcp.pl --noscreen --autodestroy
2. создать каталог: sys:\perl\scripts\my
3. скопировать trstbcp.pl в sys:\perl\scripts\my
4. прочитать выше про расположение лог-файла и файла конфигурации, сделав для себя.
5. запсутить:
trstbcp.ncf

Re: эээ

СообщениеДобавлено: 27 сен 2006, 19:02
Константин Ошмян
skoltogyan писал(а):Скрипт испольует VFS, для проверки - загружен или нет сейчас данный NLM. Есть-ли это на NW5.1 - не отвечу.
Спасибо. Еслм так, то в документации на VFS уточняется:
Virtual File Services for NetWare describes how to access the _Admin volume on a NetWare 6.0 and later server. It uses XML to do RPC type functionality with any programming language with XML parsing/wrappering capabilities.