From 47bd1e5a4e29015ea29e71ab99eebb1d35ebd261 Mon Sep 17 00:00:00 2001 From: Manuel Romero Date: Tue, 9 Jun 2020 14:10:05 +0200 Subject: [PATCH] Added onedrive PS script --- vm-qs/scripts/onedrive.ps1 | 186 +++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 vm-qs/scripts/onedrive.ps1 diff --git a/vm-qs/scripts/onedrive.ps1 b/vm-qs/scripts/onedrive.ps1 new file mode 100644 index 0000000..c677f83 --- /dev/null +++ b/vm-qs/scripts/onedrive.ps1 @@ -0,0 +1,186 @@ +Function DownloadFilesFromOneDrive() { + Process{ + Install-Module SharePointPnPPowerShellOnline + Add-Type -AssemblyName System.Web + + try { + + # --- Ask for URL and parse it + $uri = Read-Host -Prompt 'OneDrive shared link' + $decodedURL = [System.Web.HttpUtility]::UrlDecode($uri) + $decoded = [uri] $decodedURL + $url = "$($decoded.Scheme)://$($decoded.Host)$($decoded.AbsolutePath)" + + # ---- Get 'id' param from URL + $ParsedQueryString = [System.Web.HttpUtility]::ParseQueryString($decoded.Query) + $i = 0 + $folderSiteRelativeUrl = "" + foreach($QueryStringObject in $ParsedQueryString){ + if ( $QueryStringObject -eq "id" ) { + $folderSiteRelativeUrl = $ParsedQueryString[$i] + break + } + $i++ + } + $ParamId = $folderSiteRelativeUrl + $decoded.Segments | ForEach-Object { + Write-Host $_ + [regex]$pattern = $_ + $ParamId = $pattern.replace($ParamId, "", 1) + } + Write-Host "FolderSiteRelativeUrl: $ParamId" + # ---- + + # --- Get OneDrive credentials and Connect + $credentials = Get-Credential -Message "OneDrive login:" -UserName "@qlik.com" + Connect-PnPOnline -Url $url -Credentials $credentials + # --- + + # Create folders and download files from OneDrive + New-Item -Path "C:\Temp" -Name "qs-import" -ItemType "directory" -Force | Out-Null + $files = Get-PnPFolderItem -FolderSiteRelativeUrl $ParamId -ItemType File -Recursive | select ServerRelativeUrl,Name,TypedObject + $files | ForEach-Object { + # Create folder + $replacedPath = $($_.ServerRelativeUrl).Replace($folderSiteRelativeUrl,"") + $folderName = Split-Path -Path $replacedPath + New-Item -Path "C:\Temp\qs-import" -Name $folderName -ItemType "directory" -Force | Out-Null + + # Download file into folder + Write-Host "Downloading file '$($_.ServerRelativeUrl)' into C:\Temp\qs-import$folderName" + Get-PnPFile -Url $($_.ServerRelativeUrl) -Path "C:\Temp\qs-import$folderName" -AsFile -Force + } + + } catch { + Write-Host $_.Exception.Message -ForegroundColor Red + } + } +} + +Function restartQse { + Write-Log "Checking Engine Service has started..." + $qse = get-service QlikSenseEngineService + write-log -Message "The engine is currently $($qse.Status)" + if ($qse.Status -eq "Stopped") { + Write-Log -Message "Starting Qlik Sense Engine and waiting 120 seconds" -Severity "Warn"; + Start-Service QlikSenseEngineService; + Restart-Service QlikSenseServiceDispatcher; + start-sleep -s 120 + } + write-log -Message "The engine is currently $($qse.Status)" +} + +Function connQSR { + $i = 1 + $statusCode = 0 + while ($statusCode -ne 200 -and $i -le 10) { + try { + $statusCode = (Invoke-WebRequest https://$($env:COMPUTERNAME)/qps/user -UseBasicParsing).statusCode + } catch { + $i++ + write-log -Message "QSR on $env:COMPUTERNAME not responding attempt $i of 10..." -Severity "Warn" + start-sleep -s 20 + } + } +} + + +# START HERE +DownloadFilesFromOneDrive + +### wait for Qlik Sense Proxy service to respond with an HTTP 200 status before proceeding +connQSR +$statusCode = (Invoke-WebRequest https://$($env:COMPUTERNAME)/qps/user -UseBasicParsing).statusCode +if ($statusCode -ne 200){ + Write-Log -Message "Waiting 25 seconds before next pass" -Severity "Warn" + restartServices + Write-Log -Message "Waiting 45 seconds for Services to ensure they are ready" -Severity "Warn" + start-sleep -s 45 + connQSR +} + +$statusCode = (Invoke-WebRequest https://$($env:COMPUTERNAME)/qps/user -UseBasicParsing).statusCode +if ($statusCode -ne 200) { + Write-Log -Message "Provisioning failed" -Severity "Error" + Exit +} +Write-Log -Message "Qlik Sense Proxy responding on $env:COMPUTERNAME, status code: $statusCode" +Write-Log -Message "Connecting to Qlik Sense Repository Service on $env:COMPUTERNAME" + +restartQse + +### Connect to the Qlik Sense Repository Service with Qlik-Cli +do { + write-log -Message "Connecting to Qlik Sense Repository"; start-sleep 15 +} +While( (Connect-Qlik $($env:COMPUTERNAME) -TrustAllCerts -UseDefaultCredentials -ErrorAction SilentlyContinue).length -eq 0 ) + +### Import scenario extensions +Write-Log -Message "Importing extensions from C:\Temp\qs-import\Extensions" +if ( Test-Path "C:\Temp\qs-import\Extensions" ) { + gci C:\\Temp\\qs-import\\Extensions\\*.zip | foreach { + try { + Write-Log -Message "Importing $_"; + Import-QlikExtension -ExtensionPath $_.FullName | Out-Null + } catch { + Write-Log -Message $_.Exception.Message -Severity "Error" + } + } +} + +### Import scenario applications +Write-Log -Message "Connecting as user Qlik to QRS" +try { + $cert = "CN=$env:COMPUTERNAME-ca" + gci cert:\CurrentUser\My | where {$_.issuer -eq $cert} | Connect-Qlik -username "$env:COMPUTERNAME\qlik" | Out-Null +} catch { + Write-Log -Message $_.Exception.Message -Severity "Error" +} + +Write-Log -Message "Importing applications from C:\Temp\qs-import\Apps" +If (Test-Path "C:\Temp\qs-import\Apps\") { + gci C:\\Temp\\qs-import\\Apps\\*.qvf | foreach { + try { + Write-Log -Message "Importing $_"; + Import-QlikApp -name $_.BaseName -file $_.FullName -upload | Out-Null + } catch { + Write-Log -Message $_.Exception.Message -Severity "Error" + } + } +} + +restartQse + +$apps = gci C:\Temp\qs-import\Apps\ -Directory +foreach ($subDirectory in $apps) { + # $encodeDirectory = [System.Web.HttpUtility]::UrlEncode($subDirectory); + $streams = $(Get-QlikStream -filter "name eq '$($subDirectory)'").name + if ( $streams -ne $subDirectory ) { + Write-Log -Message "Creating $subDirectory stream" + New-QlikStream $subDirectory | Out-Null; + $streamId = $(Get-QlikStream -filter "name eq '$($subDirectory)'").id + $systemRuleJson = (@{ + name = "Grant everyone access to $subDirectory"; + category = "Security"; + rule = '((user.name like "*"))'; + type = "Custom"; + resourceFilter = "Stream_$streamId"; + actions = 34; + ruleContext = "QlikSenseOnly"; + disabled = $false; + comment = "Stream access";} | ConvertTo-Json -Compress -Depth 10) + Write-Log -Message "Creating $subDirectory System Rule" + Invoke-QlikPost "/qrs/systemrule" $systemRuleJson | Out-Null + } + + $files = gci C:\Temp\qs-import\Apps\$subDirectory\*.qvf -File + + foreach ($file in $files) { + $streamId = $(Get-QlikStream -filter "name eq '$($subDirectory)'").id + # $encode = [System.Web.HttpUtility]::UrlEncode($file.BaseName) + Write-Log -Message "Importing $($file)"; + Import-QlikApp -name $file.BaseName -file $file.FullName -upload | Out-Null; + Write-Log -Message "Publishing $($file.BaseName) to $($subDirectory)"; + publish-qlikapp -id $(get-qlikapp -filter "name eq '$($file.BaseName)'").id -stream $streamId -name $file.BaseName | Out-Null + } +} +