global-functions: add $WaitForFile, wait for file on fetch

The fetch command is asynchronous, the file is not guaranteed to be
available when command terminates.

I opened an issue at Mikrotik support (Ticket#2019041722004999),
their answer:

> You should perform a check in a loop.
> :delay until file exist
>
> That can happen also with any configuration not just files.

So add a function to wait for a file with given name.

I have not seen this with other configuration, though.
This commit is contained in:
Christian Hesse 2019-04-18 10:39:32 +02:00
parent 9aac873163
commit 7f96e5c966
5 changed files with 35 additions and 4 deletions

View file

@ -10,6 +10,7 @@
:global SendNotification;
:global UrlEncode;
:global WaitForFile;
:local GetIssuerCN do={
:foreach IssuerI in=$1 do={
@ -39,7 +40,9 @@
:foreach Type in={ ".pem"; ".p12" } do={
:local CertFileName ([ $UrlEncode $CommonName ] . $Type);
:do {
/ tool fetch check-certificate=yes-without-crl ($CertRenewUrl . $CertFileName);
/ tool fetch check-certificate=yes-without-crl \
($CertRenewUrl . $CertFileName) dst-path=$CertFileName;
$WaitForFile $CertFileName;
:foreach PassPhrase in=$CertRenewPass do={
/ certificate import file-name=$CertFileName passphrase=$PassPhrase;
}

View file

@ -9,9 +9,10 @@
:global Identity;
:global DailyPskMatchComment;
:global UrlEncode;
:global SendNotification;
:global UrlEncode;
:global WaitForFile;
:local Seen [ :toarray "" ];
@ -76,6 +77,7 @@
:do {
/ tool fetch check-certificate=yes-without-crl \
$Url dst-path=$Attach;
$WaitForFile $Attach;
} on-error={
:set Attach "";
}

View file

@ -9,9 +9,10 @@
:global Identity;
:global DailyPskMatchComment;
:global UrlEncode;
:global SendNotification;
:global UrlEncode;
:global WaitForFile;
:local Seen [ :toarray "" ];
@ -76,6 +77,7 @@
:do {
/ tool fetch check-certificate=yes-without-crl \
$Url dst-path=$Attach;
$WaitForFile $Attach;
} on-error={
:set Attach "";
}

View file

@ -10,9 +10,10 @@
:global Identity;
:global DailyPskMatchComment;
:global UrlEncode;
:global SendNotification;
:global UrlEncode;
:global WaitForFile;
:local Seen [ :toarray "" ];
@ -82,6 +83,7 @@
:do {
/ tool fetch check-certificate=yes-without-crl \
$Url dst-path=$Attach;
$WaitForFile $Attach;
} on-error={
:set Attach "";
}

View file

@ -68,6 +68,8 @@
:global ScriptUpdatesBaseUrl;
:global ScriptUpdatesUrlSuffix;
:global WaitForFile;
:if ([ / certificate print count-only where common-name=$CommonName ] = 0) do={
:log info ("Certificate with CommonName " . $CommonName . \
" not available, downloading and importing.");
@ -76,6 +78,7 @@
($ScriptUpdatesBaseUrl . "certs/" . \
$FileName . $ScriptUpdatesUrlSuffix) \
dst-path=$FileName;
$WaitForFile $FileName;
/ certificate import file-name=$FileName passphrase="";
} on-error={
:log warning "Failed imprting certificate!";
@ -166,6 +169,7 @@
:global CertificateAvailable;
:global CleanFilePath;
:global WaitForFile;
:if ([ :len $PkgName ] = 0) do={ return false; }
:if ([ :len $PkgVer ] = 0) do={ :set PkgVer [ / system package update get installed-version ]; }
@ -179,6 +183,7 @@
/ tool fetch check-certificate=yes-without-crl \
("https://upgrade.mikrotik.com/routeros/" . $PkgVer . "/" . $PkgFile) \
dst-path=$PkgDest;
$WaitForFile $PkgDest;
} on-error={
/ file remove [ find where name=$PkgDest ];
:return false;
@ -196,3 +201,20 @@
:error "Locked."
}
}
# wait for file to be available
:global WaitForFile do={
:global CleanFilePath;
:local FileName [ $CleanFilePath [ :tostr $1 ] ];
:local I 0;
:while ([ file print count-only where name=$FileName ] = 0) do={
:if ($I > 20) do={
:return false;
}
:delay 100ms;
:set I ($I + 1);
}
:return true;
}