Provoz CAQdesktop na VPN


Pro optimalizaci spouštění aplikace přes VPN je možné umístit kompletní adresář CAQdesktop na lokální disk uživatele a tím velice zrychlit start aplikace. Samotná aplikace si tak bude přes VPN stahovat pouze data z MSSQL serveru. Je vhodné nastavení také výchozího filtru pro konkrétní modul a omezit tak množství dat, které se mají při spuštění načíst.

Toto řešení spouštění ovšem komplikuje samotné provádění Upgrade aplikace CAQdesktop, kdy je nutné zajistit stejné verze na všech stanicích. Jednou z možností je použití scriptu viz níže, který budou uživatelé používat pro spuštění aplikace. Script si zkontroluje a porovná místní a síťový adresář s aplikací a dle toho se rozhodne zda je nutné provést aktualizaci místní kopie ze které následně spustí samotný program.

Podmínky pro nasazení

  • Script pracuje s porovnáním souboru /APL/release.xml, který určuje a identifikuje verzi. Pozor, pokud používáte verze, které tento soubor nemají (PreRelease) nemůžete script použít.
  • Pro nasazení scriptu je nutné, aby byla v síťovém prostředí nasazena služba CAQservice, která se stará o globální distribuci konfigurace v opačném případě bude docházet k nesprávnému aktivování instalace a problémům s provozem.

 

Ukončení práce na klientských stanicích

Při provádění aktualizace na serveru je nutné zjistit uživatele, kteří momentálně s Palstat CAQdesktop pracují a vyzvat je k ukončení aplikace na lokálních stanicích, jinak může dojít k situaci, kdy se změní na serveru struktura databází a aplikace, která nebyla aktualizována se může dostat do nepředvídatelného chybového stavu.

Seznam uživatelů, kteří momentálně v systému poracují je možné zjistit pomocí aplikace ./APL/CaqAdmin.exe pod záložkou "Licence" vis. screenshot.

 

Nasazení PowerShell scriptu

  • Na klientskou stanici umístěte script níže, například do adresáře "c:/Palstat3G_local_production/"
  • Script pojmenujte "RUN_Palstat.ps1"
  • Upravte script tak aby odpovídal vašemu produkčnímu prostředí a to hodnoty "$sourcePalstatDir", "$targetPalstatDir"
  • Vytvořte ve stejném adresáři zástupce, který bude spouštět příslušný PowerShell, viz. screenshot, pro lepší uživatelský komfort lze zástupci přiřadit ikonu příslušné aplikace.
  • Script respektuje volitelně argument s názvem aplikace, kterou chcete spustit. Na screenshot můžete vidět nastavení zástupce pro spouštení modulu "Měřidla", název argumentu odpovídá EXE souboru v adresáři APL.
  • "Cíl" u zástupce musí vypadat dle příkladu s upravením na reálné hodnoty
    • (C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -File "c:/Palstat3G_local_production/RUN_Palstat.ps1")
    • Způsobů spouštění PowerShell na klientských stanicích je více a záleží na místní politice každé společnosti.
    • U zástupce si můžete upravit i ikonku, ale musí být navedena na lokální kopii.
  • "Spustit v" musí ukazovat do adresáře APL!
  • Volitelně, argument sciptu je napovinný a pokud není uveden spustí se výchozí apliakce ./APL/Launcher.exe
  • Volitelně, script hledá v síťovém umístění soubor /CONFIG/config.LocalClient.xml, pokud je soubor nalezen je tento zkopírován do lokálního umístění jako /CONFIG/config.xml, můžete tak do tohoto souboru uvést jinou IP adresu serveru se službou tak aby byla viděna pro uživatele přes VPN.

Ukázka obsahu zástupce pro pole "Cíl"

Spuštění modulu Launcher

C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -File "c:/Palstat3G_local_production/RUN_Palstat.ps1"

Spuštění modulu Měřidla
vložení názvu modulu na konec příkazu "measures" odpovídá názvu dle EXE souborů v adresáři APL

C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -ExecutionPolicy Bypass -File "c:/Palstat3G_local_production/RUN_Palstat.ps1" measures

Stažení ukázkových zástupců ve formátu ZIP

 

Ukázka lokálního adresáře na klientské stanici, zástupce lze umístit na sítový disk pro snadnější správu, nebo rozšířit script a zástupce si kopírtovat ze sítové disku na lokální stanice.

 

 

 

 

 

 

 

 

 

 

PowerShell pro lokální kopii Palstat CAQdesktop

cls
<#
v1.3 - add Set-Location
v1.2 - accept custom config.xml file for local users
v1.1 - external argument as runable programm
v1.0 - first release
#>

$sourcePalstatDir = "//10.0.01/VPN/Palstat3G/";         # demand   # network directory of CAQdesktop
$targetPalstatDir = "c:/Palstat3G_local_production/";   # demand   # local directory
$targetPalstatClientConfig = "config.LocalClient.xml";  # optional # name of custom config file for users with local copy of CAQdesktop


$sourcePalstatRelease = $sourcePalstatDir + "APL/release.xml";
$targetPalstatRelease = $targetPalstatDir + "APL/release.xml";



"
-----------------------------------------------------------------
-  PalstatCAQ LOCAL COPY CHECK                     
-  compare, copy, run both Palstat Directory  
-  ergument represent name of module exp: 'measures'
-
-  SOURCE:    $sourcePalstatDir
-  TARGET:    $targetPalstatDir
-  ARGUMENTS: $($args.count)
-----------------------------------------------------------------
"


if ( $($args.count) -eq 1 ) {
    $arg_file = $sourcePalstatDir+"APL/"+$($args[0])+".exe";
    $arg_file2 = $targetPalstatDir+"APL/"+$($args[0])+".exe";
    "[I]: Script accepted argument"
    "[I]: Argument -> $($args[0])"
    "[I]: Argument -> $arg_file"

    #hledame zda takovy soubor vubec existuje
    if (!(Test-Path $arg_file) -and !(Test-Path $arg_file2) ) {
        "[E]: Argument -> file not exist -> $arg_file"
        exit;
    }else{
        $_run_argument = $arg_file2;
    }

}else{
    $_run_argument = "NO";
}



"[I]: Check release.xml files in source and target directory"

if (!(Test-Path $targetPalstatRelease) ) {
  "[W]: NOT EXIST Target Directory '$targetPalstatDir'"

  New-Item -Path "$targetPalstatDir" -Name "APL" -ItemType "directory" | Out-Null
  New-Item -Path "$targetPalstatDir/APL/" -Name "release.xml" -ItemType "file" -Value "First RUN" | Out-Null
  "[I]: Directory Created"
}


if (!(Test-Path $sourcePalstatRelease) ) {
  "[E]: NOT EXIST -> $sourcePalstatRelease"
   exit;
}

if (!(Test-Path $targetPalstatRelease) ) {
  "[E]: NOT EXIST -> $targetPalstatRelease"
}

"[I]: OK"

if(Compare-Object -ReferenceObject $(Get-Content $targetPalstatRelease) -DifferenceObject $(Get-Content $sourcePalstatRelease)){
    "[I]: Versions are different, copy actual from server!!!"



    if ((Test-Path "$targetPalstatDir/APLOLD/") ) {       
        Remove-Item "$targetPalstatDir/APLOLD/" -Recurse
    }

    #### zkusime prejmenovat jestli neni slozka nekym drzena
    if ((Test-Path "$targetPalstatDir/APL/") ) {    
     "[I]: Old APL exist, try rename to check if isnt block"
     Rename-Item -path "$targetPalstatDir/APL" -newName "$targetPalstatDir/APLOLD" | Out-Null

     if (!(Test-Path "$targetPalstatDir/APLOLD/") ) {       
        "[E]: unable rename '$targetPalstatDir/APL', some application is open?"
        exit;
     }

    }   
    


    if ((Test-Path "$targetPalstatDir/CONFIG/") ) {     
        "[I]: Delete Dir CONFIG - done"  
        Remove-Item "$targetPalstatDir/CONFIG/" -Recurse
    }
    New-Item -Path "$targetPalstatDir" -Name "CONFIG" -ItemType "directory" | Out-Null


    if ((Test-Path "$targetPalstatDir/APL/") ) {
        "[I]: Delete Dir APL    - done"
        Remove-Item "$targetPalstatDir/APL/" -Recurse
    }
    New-Item -Path "$targetPalstatDir" -Name "APL" -ItemType "directory" | Out-Null


    if ((Test-Path "$targetPalstatDir/DOC/") ) {       
        "[I]: Delete Dir DOC    - done"
        Remove-Item "$targetPalstatDir/DOC/" -Recurse
    }
    New-Item -Path "$targetPalstatDir" -Name "DOC" -ItemType "directory" | Out-Null


    if ((Test-Path "$targetPalstatDir/SETUP/") ) {       
        "[I]: Delete Dir SETUP  - done"
        Remove-Item "$targetPalstatDir/SETUP/" -Recurse
    }
    New-Item -Path "$targetPalstatDir" -Name "SETUP" -ItemType "directory" | Out-Null


    Copy-Item -Path "$sourcePalstatDir/CONFIG/*" -Destination "$targetPalstatDir/CONFIG" -Recurse
    "[I]: Copy Dir CONFIG - done"
    
    Copy-Item -Path "$sourcePalstatDir/SETUP/*" -Destination "$targetPalstatDir/SETUP" -Recurse
    "[I]: Copy Dir SETUP  - done"

    Copy-Item -Path "$sourcePalstatDir/DOC/*" -Destination "$targetPalstatDir/DOC" -Recurse
    "[I]: Copy Dir DOC    - done"

    Copy-Item -Path "$sourcePalstatDir/APL/*" -Destination "$targetPalstatDir/APL" -Recurse
    "[I]: Copy Dir APL    - done"
    


}


#run CAQdesktop from local destination
if ((Test-Path $targetPalstatRelease) ) {
  if  ( !([string]::IsNullOrWhitespace($targetPalstatClientConfig)) ) {
    "[I]: Local custom config file -> defined"
    $customCfg = $sourcePalstatDir+"CONFIG/"+$targetPalstatClientConfig;
     if  ((Test-Path $customCfg) ) {
           "[I]: Local custom config file -> delete old file from local destination"
           Remove-Item "$targetPalstatDir/CONFIG/config.xml" | Out-Null

           "[I]: Local custom config file -> copy to local destination"
           Copy-Item -Path "$customCfg" -Destination "$targetPalstatDir/CONFIG/config.xml" | Out-Null

    }else{
        "[W]: Local custom config file -> defined but not exist "+$customCfg
    }
  }else{
    "[I]: Local custom config file -> NOdefined"
  }

    Set-Location "$targetPalstatDir/APL"
    if ( $_run_argument -eq "NO" ){
        "[I]: Versions are same, RUN LAUNCHER"
        $targetPalstat = $targetPalstatDir+"APL/Launcher.exe"
        $targetPalstatApl = $targetPalstatDir+"APL/"
        Start-Process -FilePath "$targetPalstat" -WorkingDirectory "$targetPalstatApl"
    }else{
        "[I]: Versions are same, RUN ARGUMENT"
        &$_run_argument
    }
 
}

##

 

 

 

Průběh spuštení zástupce při prvním spuštení

 

https://www.palstat.cz/ - Systém řízení kvality Ubytování ve Vrchlabí