ApoAlly Insights Configuratie#
Windows Server 2019#
Powershell Upload-Script
apoally-insights-upload.ps1
# upload_csv.ps1
#
# Dit script zoekt nu automatisch naar een optioneel schema-bestand (.json of .csvs)
# met dezelfde basisnaam als het CSV/TSV-bestand. JSON heeft prioriteit boven CSVS als beide bestaan.
# Als er geen schema-bestand wordt gevonden, wordt alleen het CSV/TSV-bestand geüpload.
#
# Omgeving:
# $apiUrl - Standaard: "https://api.apoally.de/insights/upload"
# $apiKey - Standaard: "YOUR-API-KEY"
# $csvFolder - Standaard: "D:\ApoAlly-Insights"
# $waitMinutes - Standaard: 5
#
# Dit script controleert elk CSV/TSV-bestand in de $csvFolder. Als een bestand ouder is dan $waitMinutes,
# wordt het geüpload naar de API. Als er een fout optreedt, wordt een error.log aangemaakt.
# Configuratie
$apiUrl = "https://api.apoally.de/insights/upload"
$apiKey = "YOUR-API-KEY"
$csvFolder = "D:\ApoAlly-Insights"
$waitMinutes = 5
function Upload-SingleFile {
param (
[string]$CsvFile
)
# Controleer op een bestaand JSON- of CSVS-schema-bestand met dezelfde basisnaam (JSON heeft prioriteit)
$schemaFileJson = Join-Path $CsvFile.DirectoryName ("$($CsvFile.BaseName).json")
$schemaFileCsvs = Join-Path $CsvFile.DirectoryName ("$($CsvFile.BaseName).csvs")
$schemaFileToUpload = $null
if (Test-Path $schemaFileJson) {
$schemaFileToUpload = $schemaFileJson
}
elseif (Test-Path $schemaFileCsvs) {
$schemaFileToUpload = $schemaFileCsvs
}
Write-Host "Bestand uploaden: $($CsvFile.FullName)"
if ($schemaFileToUpload) {
Write-Host "Optioneel schema-bestand gevonden: $schemaFileToUpload"
}
# Bepaal MIME-type op basis van extensie (.csv of .tsv)
$extension = $CsvFile.Extension.ToLower()
$contentType = "text/csv"
if ($extension -eq ".tsv") {
$contentType = "text/tab-separated-values"
}
# Bouw de multipart/form-data body
$boundary = "----MyBoundary$(Get-Random)"
$LF = "`r`n"
$bodyLines = @()
# 1) Voeg het CSV/TSV-gedeelte toe
$csvContent = Get-Content $CsvFile.FullName -Raw
$bodyLines += "--$boundary"
$bodyLines += "Content-Disposition: form-data; name=`"files`"; filename=`"$($CsvFile.Name)`""
$bodyLines += "Content-Type: $contentType$LF"
$bodyLines += $csvContent
# 2) Als er een schema-bestand is, voeg dit toe als een tweede gedeelte
if ($schemaFileToUpload) {
$schemaContent = Get-Content $schemaFileToUpload -Raw
$bodyLines += "--$boundary"
$bodyLines += "Content-Disposition: form-data; name=`"files`"; filename=`"$($schemaFileToUpload)`""
if ($schemaFileToUpload.ToLower().EndsWith(".json")) {
$bodyLines += "Content-Type: application/json$LF"
}
else {
# Voor .csvs behandelen we het als tekst
$bodyLines += "Content-Type: text/plain$LF"
}
$bodyLines += $schemaContent
}
# Eindgrens
$bodyLines += "--$boundary--"
$body = $bodyLines -join $LF
$headers = @{
"X-API-Key" = $apiKey
"Content-Type" = "multipart/form-data; boundary=$boundary"
}
try {
$response = Invoke-RestMethod -Uri $apiUrl -Method Post -Headers $headers -Body $body
return $response
}
catch {
throw $_
}
}
function Upload-CSVFiles {
param (
[string]$Folder
)
# Haal alle CSV- en TSV-bestanden op, negeer bestanden die '_img.csv' of '_img.tsv' bevatten
$csvFiles = Get-ChildItem -Path $Folder -Recurse -File -Include *.csv, *.tsv |
Where-Object { $_.Name -notmatch '_img\.(csv|tsv)$' }
foreach ($file in $csvFiles) {
# Definieer de foutlog-bestandsnaam voor het databestand
$errorLog = Join-Path $file.DirectoryName ("$($file.BaseName).error.log")
# Sla over als er al een foutlog bestaat
if (Test-Path $errorLog) {
Write-Host "Bestand overslaan vanwege bestaande foutlog: $($file.FullName)"
continue
}
# Controleer of het bestand minstens $waitMinutes oud is
$fileAge = (Get-Date) - $file.LastWriteTime
if ($fileAge.TotalMinutes -lt $waitMinutes) {
Write-Host "Bestand is niet oud genoeg (Leeftijd: $([math]::Round($fileAge.TotalMinutes, 2)) minuten): $($file.FullName)"
continue
}
Write-Host "Probeer uploaden van: $($file.FullName)"
try {
$response = Upload-SingleFile -CsvFile $file
if ($response.status -eq "success") {
Write-Host "Upload succesvol: $($file.FullName)"
Remove-Item $file.FullName -Force
# Controleer en verwijder bijbehorende _img.csv of _img.tsv bestand
$imgCsv = Join-Path $file.DirectoryName ("$($file.BaseName)_img.csv")
$imgTsv = Join-Path $file.DirectoryName ("$($file.BaseName)_img.tsv")
if (Test-Path $imgCsv) {
Remove-Item $imgCsv -Force
Write-Host "Bijbehorend _img.csv bestand verwijderd: $imgCsv"
}
if (Test-Path $imgTsv) {
Remove-Item $imgTsv -Force
Write-Host "Bijbehorend _img.tsv bestand verwijderd: $imgTsv"
}
}
else {
Write-Host "Upload mislukt voor bestand: $($file.FullName). Foutlog wordt aangemaakt."
$errorMessage = "Fout bij uploaden: " + ($response.error)
$errorMessage | Out-File -FilePath $errorLog -Encoding utf8
}
}
catch {
Write-Host "Fout bij uploaden bestand $($file.FullName): $_. Foutlog wordt aangemaakt."
$_ | Out-File -FilePath $errorLog -Encoding utf8
}
}
}
function Start-Watch {
param (
[string]$Folder,
[int]$WaitMinutes
)
# Initiële verwerking bij opstarten
Upload-CSVFiles -Folder $Folder
# Herhaal eindeloos, wacht 1 minuut tussen controles
while ($true) {
Start-Sleep -Seconds 60
Upload-CSVFiles -Folder $Folder
}
}
# Start mapbewaking
Start-Watch -Folder $csvFolder -WaitMinutes $waitMinutes
Handleiding voor installatie en configuratie van het script#
1. Script opslaan#
- Open een teksteditor (bijv. Kladblok).
- Kopieer de inhoud van het PowerShell-script
apoally-insights-upload.ps1in de editor. - Sla het bestand op onder de naam
apoally-insights-upload.ps1in de gewenste map, bijv.C:\Scripts.
2. PowerShell-uitvoeringsbeleid aanpassen#
Om het script uit te voeren, moet het PowerShell-uitvoeringsbeleid worden aangepast:
- Open PowerShell als beheerder.
- Voer de volgende opdracht in om het uitvoeringsbeleid te wijzigen:
- Bevestig de wijziging met
Y(Ja).
3. API-sleutel en configuratie aanpassen#
- Open het bestand
apoally-insights-upload.ps1met een teksteditor. - Vervang
YOUR-API-KEYdoor uw daadwerkelijke API-sleutel. - Pas het pad voor de map
$csvFolderaan als uw CSV-bestanden in een andere map zijn opgeslagen. - Sla de wijzigingen op.
4. Taak voor automatisch starten instellen#
Om het script automatisch bij het opstarten van het systeem uit te voeren, stelt u een geplande taak in:
- Open de Taakplanner via het Startmenu.
- Klik op Taak maken.
- Geef onder Algemeen een naam op voor de taak, bijv.
ApoAlly Insights Upload. - Schakel de optie Uitvoeren met hoogste bevoegdheden in.
- Ga naar het tabblad Triggers en klik op Nieuw: - Selecteer Bij opstarten. - Klik op OK.
- Ga naar het tabblad Acties en klik op Nieuw: - Selecteer Programma starten. - Voer het volgende in het veld Programma/script in: - Voer het volgende in het veld Argumenten toevoegen (optioneel) in: - Klik op OK.
- Ga naar het tabblad Voorwaarden en schakel de optie Taak alleen starten als de computer op netstroom werkt uit, als de taak ook op batterijvoeding moet worden uitgevoerd.
- Klik op OK om de taak te maken.
5. Testuitvoering#
- Voer het script handmatig uit om te controleren of het correct werkt:
- Controleer de uitvoer en de aangemaakte logbestanden om te bevestigen dat er geen fouten optreden.
6. Monitoring en probleemoplossing#
- Controleer regelmatig de logbestanden die in dezelfde map als de CSV-bestanden worden opgeslagen.
- Als de geplande taak niet wordt uitgevoerd, controleer dan de instellingen in de Taakplanner en zorg ervoor dat het script correct is geconfigureerd.
Met deze stappen is het script succesvol ingesteld op uw Windows Server 2019 en wordt het automatisch uitgevoerd bij het opstarten van het systeem.