forked from smapOne/PowershellScripts
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDownload Records.ps1
More file actions
283 lines (236 loc) · 11.6 KB
/
Download Records.ps1
File metadata and controls
283 lines (236 loc) · 11.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
# Created By: Michael Rath und Sebastian Trebbin, smapOne AG
# Version 1.6
#
# Änderungen:
# * Erläuterung für die Konfiguration eingepflegt
# * Download von Assets eines Datensatzes
# * Erweiterung des HTTP Requests um API Limitierung (HTTP Status 429)
#
#
# Systemvoraussetzungen:
# * das Skript kann nur unter PowerShell Version 5.1.x und höher korrekt betrieben werden
# * über den Befehl $PSVersionTable kann dies in einer PowerShell Console eingesehen werden
# * für Windows Server 2016 sowie Windows 10 Systeme sollte dies die vorinstallierte Version sein
# * für Windows Server 2012 sowie Windows 7/8 kann das Update über folgenden Link bezogen werden: https://docs.microsoft.com/de-de/powershell/wmf/5.1/install-configure
#
#
# KONFIGURATION:
#
# das Config-Array regelt alle Einstellungen für den Zugriff auf die smapOne Apps, den Datenbezug etc.
# für jede smapOne App muss ein separater Eintrag in Array mit den jeweils gewünschten Einstellungen vorgenommen werden
# Parameter des Arrays:
# smapId - die Id der smapOne App, welche u.a. aus der Browser URL für die App entnommen werden kann, Datentyp: GUID
# exportJSON - soll der Datensatz als JSON exportiert werden, Datentyp: Bool ($TRUE, $FALSE)
# exportJSONPath - Dateipfad unter dem die JSON-Datei abgelegt werden soll, UNC-Pfade sind ebenfalls möglich, Datentyp: String
# exportJSONName - Dateiname unter dem die JSON-Datei abgelegt werden soll, kann dynamisch durch Inhalte des Datensatzes ergänzt werden, siehe separate Beschreibung
# exportPDF - soll der Datensatz als PDF exportiert werden, Datentyp: Bool ($TRUE, $FALSE)
# exportPDFPath - Dateipfad unter dem die PDF-Datei abgelegt werden soll, UNC-Pfade sind ebenfalls möglich, Datentyp: String
# exportPDFNameUsePlattform - der Dateiname des PDF-Berichtes wird direkt aus den Einstellungen der Plattform entnommen, Datentyp: Bool ($TRUE, $FALSE)
# exportPDFName - Dateiname unter dem die PDF-Datei abgelegt werden soll, kann dynamisch durch Inhalte des Datensatzes ergänzt werden, siehe separate Beschreibung
# exportAssets - die dem Datensatz enthaltenen Fotos / Skizzen etc. werden separat heruntergeladen
# exportAssetsPath - Dateipfad unter dem die separaten Assets abgelegt werden sollen, UNC-Pfade sind ebenfalls möglich, Datentyp: String
# deleteAfterExport - Datensätze nach dem Export löschen
# token - Login Token des Creator Accounts unter welchem die App abgelegt ist, Datentyp: GUID
# debug - abgerufene Datensätze werden nicht als exportiert markiert
#
# Erweiterungen für Dateinamen
# ein Dateiname kann eine einfacher String sein, Beispiel: exportJSONName='JSON Bericht Wartung.json'
# ein Dateiname kann direkt aus der Benennung des Berichtes der Plattform resultieren
#
#-------------------------------------------------------------------------------
$Logfile = "$PSScriptRoot\log.txt"
$Proxy = ""
$configArray = @(
# Beispiel:
[pscustomobject]@{
smapId = "00000000-dead-beef-0000-000000000123";
exportJSON = $true;
exportJSONPath = "$PSScriptRoot\export";
exportJSONName = 'JSON_$($R.id).json'
exportPDF = $true;
exportPDFPath = '$PSScriptRoot\export\';
exportPDFNameUsePlattform = $true;
exportPDFName = '';
exportAssets = $true;
exportAssetsPath = '$PSScriptRoot\$($R.id)';
deleteAfterExport = $false;
token = "BeispielToken";
debug = $false;
}
#,[pscustomobject]@{
# smapId = "8c76e6c6-3186-4dfd-9eab-f5e4e5975f77";
#
# exportJSON = $false;
# exportJSONPath = "$env:USERPROFILE\Desktop\export";
# exportJSONName = 'JSON Test $($R.id).json'
#
# exportPDF = $false;
# exportPDFPath = '$env:USERPROFILE\Desktop\export\';
# exportPDFNameUsePlattform = $true;
# exportPDFName = '';
#
# deleteAfterExport = $false;
#
# exportAssets = $true;
# exportAssetsPath = '$env:USERPROFILE\Desktop\export\$($R.id)';
#
# token = "BEISPIELTOKEN";
# debug = $false;
#}
)
function Log($Text) {
$Text = "$(Get-Date -Format g) $Text";
Write-Host $Text;
Add-content $Logfile -value $Text
}
function GetFileName($fileName) {
$fileName = $fileName.Replace("inline; filename=", "")
if ($fileName.IndexOf("=?utf-8?B?") -ge 0) {
$fileName = $fileName.Replace("=?utf-8?B?", "")
$fileName = $fileName.Replace("?=", "")
$fileName = $fileName.Substring(1, $fileName.length - 2) #da führende und Ende " entfernen
$fileName = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($fileName))
} else {
if ($fileName.StartsWith("""")) {
$fileName = $fileName.Substring(1, $fileName.length - 2)
}
}
return $fileName
}
function doWebRequest ($uriString) {
try {
if (($Proxy -ne "") -and ($Proxy -ne $null)) {
$Response = Invoke-WebRequest -Proxy $Proxy $uriString
} else {
$Response = Invoke-WebRequest $uriString
}
return $Response;
} catch {
if ($_.Exception.Response.StatusCode -eq 429) {
$waitSecs = $_.Exception.Response.Headers["Retry-After"];
Log("HTTP Status 429 - wait $waitSecs Seconds");
Start-Sleep -s $waitSecs;
return doWebRequest -uriString $uriString;
} else {
Log("Fehler: $($_.Exception.Message) - $($_.Exception.Response.StatusCode)")
return "";
}
}
}
function doWebRequestDelete ($uriString) {
try {
$Response = Invoke-WebRequest -Method Delete $uriString
return $Response;
} catch {
if ($_.Exception.Response.StatusCode -eq 429) {
$waitSecs = $_.Exception.Response.Headers["Retry-After"];
Log("HTTP Status 429 - wait $waitSecs Seconds");
Start-Sleep -s $waitSecs;
return doWebRequest -uriString $uriString;
} else {
Log("Fehler: $($_.Exception.Message) - $($_.Exception.Response.StatusCode)")
return "";
}
}
}
function doWebRequestDownloadFile($uriString, $path, $fileName) {
if ($null -eq $fileName) {
$fileMeta = doWebRequest -uriString $uriString;
$fileName = GetFileName($fileMeta.headers["Content-Disposition"])
}
Log("Write File: $($path)\$($fileName)")
try {
if (($Proxy -ne "") -and ($Proxy -ne $null)) {
$Response = Invoke-WebRequest $uriString -Proxy $Proxy -OutFile "$($path)\$($fileName)"
} else {
$Response = Invoke-WebRequest $uriString -OutFile "$($path)\$($fileName)"
}
} catch {
if ($_.Exception.Response.StatusCode -eq 429) {
$waitSecs = $_.Exception.Response.Headers["Retry-After"];
Log("wait $waitSecs Seconds");
Start-Sleep -s $waitSecs;
doWebRequestDownloadFile -uriString $uriString -path $path -fileName $fileName
} else {
Log("Fehler: $($_.Exception.Message) - $($_.Exception.Response.StatusCode)")
return "";
}
}
}
function GetRec($EC, $R) {
Log("Processing Record: $($R.id)")
if ($EC.exportJSON) {
if (Test-Path $EC.exportJSONPath) {
Log("Export JSON")
$httpString = "https://platform.smapone.com/backend/intern/Smaps/$($R.smapId)/Versions/$($R.version)/Data/$($R.id).json?markAsExported=false&useDefault=false&accesstoken=$($EC.token)"
$jsonName = $ExecutionContext.InvokeCommand.ExpandString($EC.exportJSONName) -replace "`n", "" -replace "`r", "";
doWebRequestDownloadFile -uriString $httpString -path $EC.exportJSONPath -fileName $jsonName
} else {
Log("Pfad nicht vorhanden: $($EC.exportJSONPath)")
}
}
if ($EC.exportPDF) {
$exportPDFPath = $ExecutionContext.InvokeCommand.ExpandString($EC.exportPDFPath);
if (!(Test-Path $exportPDFPath)) {
Log("Create Folder: $($exportPDFPath)")
New-Item -ItemType Directory -Force -Path $exportPDFPath | Out-Null
}
Log("Export PDF")
$httpString = "https://platform.smapone.com/backend/intern/Smaps/$($R.smapId)/Versions/$($R.version)/Data/$($R.id).Pdf?markAsExported=false&useDefault=false&accesstoken=$($EC.token)"
$pdfName = $null;
if ($EC.exportPDFNameUsePlattform -eq $false) {
$pdfName = $ExecutionContext.InvokeCommand.ExpandString($EC.exportPDFName) -replace "`n", "" -replace "`r", "";
}
doWebRequestDownloadFile -uriString $httpString -path $exportPDFPath -fileName $pdfName
}
if ($EC.exportAssets) {
$exportAssetsPath = $ExecutionContext.InvokeCommand.ExpandString($EC.exportAssetsPath);
if (!(Test-Path $exportAssetsPath)) {
Log("Create Folder: $($exportAssetsPath)")
New-Item -ItemType Directory -Force -Path $exportAssetsPath | Out-Null
}
Log("Export Assets")
$httpString = "https://platform.smapone.com/backend/intern/Smaps/$($R.smapId)/Versions/$($R.version)/Data/$($R.id)/Files?accesstoken=$($EC.token)"
$httpResultList = doWebRequest -uriString $httpString;
$jsonList = $httpResultList.Content | ConvertFrom-Json
foreach ($jsonRec in $jsonList) {
$httpString = "https://platform.smapone.com/backend/intern/Smaps/$($R.smapId)/Versions/$($R.version)/Data/$($R.id)/Files/$($jsonRec.fileId)?accesstoken=$($EC.token)"
$assetName = $jsonRec.fileName;
if (!($assetName.StartsWith("Signature_"))) {
Log("Write File: $($exportAssetsPath)\$($assetName)")
doWebRequestDownloadFile -uriString $httpString -path $exportAssetsPath -fileName $assetName
}
}
}
if ($EC.deleteAfterExport -and -not $EC.debug) {
Log("Delete $($R.id)")
$httpString = "https://platform.smapone.com/backend/intern/Smaps/$($R.smapId)/Versions/$($R.version)/Data/$($R.id)?accesstoken=$($EC.token)"
doWebRequestDelete -uriString $httpString;
}
}
function GetRecList($ElementConfig) {
Log("Start loading Recordlist with Config")
Log("SmapId: $($ElementConfig.smapId)")
if ($ElementConfig.debug) {
$httpString = "https://platform.smapone.com/backend/intern/Smaps/$($ElementConfig.smapId)/Data?markAsExported=false&format=Json&accessToken=$($ElementConfig.token)"
} else {
$httpString = "https://platform.smapone.com/backend/intern/Smaps/$($ElementConfig.smapId)/Data?markAsExported=true&format=Json&state=New&accessToken=$($ElementConfig.token)"
}
$httpResultList = doWebRequest -uriString $httpString;
$jsonList = $httpResultList.Content | ConvertFrom-Json
Log("Element count: $($jsonList.Count)")
foreach ($jsonRec in $jsonList) {
GetRec -EC $ElementConfig -R $jsonRec
Log("++++++++++")
}
Log("##########")
}
function StartRoutine($Config) {
Log("----------------")
Log("Start Script")
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12
foreach ($element in $Config) {
GetRecList($element)
}
}
StartRoutine($configArray)