# ========================================================================================== # Trias EftPosCon - εγκατάσταση/αναβάθμιση με μία εντολή (για τεχνικούς, μέσω AnyDesk/RustDesk) # # Εκτέλεση (Win+R ή γραμμή εντολών): # powershell -NoExit -ExecutionPolicy Bypass -Command "[Net.ServicePointManager]::SecurityProtocol=3072;$w=New-Object Net.WebClient;$w.Encoding=[Text.Encoding]::UTF8;iex $w.DownloadString('https://parochos.triasapps.gr/eftposcon/install.txt')" # # Τι κάνει: # 1. Ζητά δικαιώματα διαχειριστή (αν δεν τα έχει). # 2. Κατεβάζει την τελευταία έκδοση (update.json + zip) και ελέγχει το SHA256. # 3. Βρίσκει πού είναι εγκατεστημένο το EftPosCon. # 4. Περιμένει να μην υπάρχει αίτημα EFT σε εξέλιξη, κλείνει την εφαρμογή, # κρατά αντίγραφο ασφαλείας, αντικαθιστά τα αρχεία (το Settings.json μένει ως έχει) και την ξανανοίγει. # 5. Αν η νέα έκδοση δεν μείνει ανοιχτή, επαναφέρει την προηγούμενη. # # Για δοκιμές: $env:EFTPOSCON_BASEURL (άλλη πηγή), $env:EFTPOSCON_INSTALLDIR (συγκεκριμένος φάκελος) # και $env:EFTPOSCON_NOELEVATE=1 (χωρίς αίτημα δικαιωμάτων, για φάκελο που δεν τα χρειάζεται). # ========================================================================================== & { $ErrorActionPreference = 'Stop' [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor 3072 $BaseUrl = 'https://parochos.triasapps.gr/eftposcon/' if ($env:EFTPOSCON_BASEURL) { $BaseUrl = $env:EFTPOSCON_BASEURL } if (-not $BaseUrl.EndsWith('/')) { $BaseUrl += '/' } $Bootstrap = "[Net.ServicePointManager]::SecurityProtocol=3072;`$w=New-Object Net.WebClient;`$w.Encoding=[Text.Encoding]::UTF8;iex `$w.DownloadString('$($BaseUrl)install.txt')" function Say($text, $color) { if ($color) { Write-Host $text -ForegroundColor $color } else { Write-Host $text } } function Banner($text, $color) { Say '' Say ('=' * 70) $color Say (' ' + $text) $color Say ('=' * 70) $color Say '' } # ---- 1. Δικαιώματα διαχειριστή ------------------------------------------------------- $principal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent()) if (-not $env:EFTPOSCON_NOELEVATE -and -not $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Say 'Χρειάζονται δικαιώματα διαχειριστή. Αποδεχθείτε το παράθυρο που θα εμφανιστεί.' Yellow $encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($Bootstrap)) Start-Process powershell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -NoExit -EncodedCommand $encoded" return } $log = $null function Log($text) { Say $text if ($log) { try { Add-Content -Path $log -Value ((Get-Date -Format 'yyyy-MM-dd HH:mm:ss') + ' [install] ' + $text) -Encoding UTF8 } catch { } } } try { Add-Type -AssemblyName System.IO.Compression.FileSystem # ---- 2. Τελευταία έκδοση -------------------------------------------------------------- Say "Έλεγχος τελευταίας έκδοσης από $BaseUrl ..." $web = New-Object Net.WebClient $web.Encoding = [Text.Encoding]::UTF8 $manifestUrl = $BaseUrl + 'update.json' if ($BaseUrl -like 'http*') { $manifestUrl += '?t=' + [DateTime]::UtcNow.Ticks } # χωρίς cache $manifest = $web.DownloadString($manifestUrl) | ConvertFrom-Json if (-not $manifest.version -or -not $manifest.url -or -not $manifest.sha256) { throw 'Μη έγκυρο update.json.' } $newVersion = [Version]$manifest.version $work = Join-Path $env:ProgramData 'Trias\EftPosConUpdates' New-Item -ItemType Directory $work -Force | Out-Null $zip = Join-Path $work ("TriasEftPosCon-" + $manifest.version + ".zip") $zipUrl = (New-Object Uri((New-Object Uri($BaseUrl)), $manifest.url)).AbsoluteUri if (-not (Test-Path $zip) -or (Get-FileHash $zip -Algorithm SHA256).Hash -ne $manifest.sha256.Trim().ToUpper()) { Say "Λήψη έκδοσης $($manifest.version) ..." $web.DownloadFile($zipUrl, $zip + '.download') Move-Item ($zip + '.download') $zip -Force } $hash = (Get-FileHash $zip -Algorithm SHA256).Hash if ($hash -ne $manifest.sha256.Trim().ToUpper()) { Remove-Item $zip -Force; throw "Το αρχείο δεν πέρασε τον έλεγχο SHA256 (λήφθηκε $hash)." } Say "Η έκδοση $($manifest.version) κατέβηκε και επαληθεύτηκε." Green # ---- 3. Φάκελος εγκατάστασης --------------------------------------------------------- $install = $env:EFTPOSCON_INSTALLDIR if (-not $install) { $running = Get-Process TriasEftPosCon -ErrorAction SilentlyContinue | Where-Object { $_.Path } | Select-Object -First 1 if ($running) { $install = Split-Path $running.Path } } if (-not $install) { $candidates = @( (Join-Path ${env:ProgramFiles(x86)} 'Trias\Trias EftPosCon'), (Join-Path $env:ProgramFiles 'Trias\Trias EftPosCon') ) foreach ($root in @(${env:ProgramFiles(x86)}, $env:ProgramFiles, 'C:\')) { if ($root -and (Test-Path $root)) { $candidates += Get-ChildItem $root -Directory -ErrorAction SilentlyContinue | ForEach-Object { Get-ChildItem $_.FullName -Filter TriasEftPosCon.exe -Recurse -Depth 2 -ErrorAction SilentlyContinue | ForEach-Object { $_.DirectoryName } } } } $install = $candidates | Where-Object { $_ -and (Test-Path (Join-Path $_ 'TriasEftPosCon.exe')) } | Select-Object -First 1 } if (-not $install -or -not (Test-Path (Join-Path $install 'TriasEftPosCon.exe'))) { throw 'Δεν βρέθηκε εγκατάσταση του EftPosCon σε αυτόν τον υπολογιστή.' } $install = (Resolve-Path $install).Path $exe = Join-Path $install 'TriasEftPosCon.exe' $log = Join-Path $install 'update.log' $oldVersion = [Version]((Get-Item $exe).VersionInfo.FileVersion) Log "Εγκατάσταση: $install (έκδοση $oldVersion)" if ($oldVersion -ge $newVersion) { Banner "ΗΔΗ ΕΝΗΜΕΡΩΜΕΝΟ - EftPosCon $oldVersion" Green return } # ---- 4. Αναμονή για αίτημα EFT σε εξέλιξη ------------------------------------------- $icgFolders = @() $settingsFile = Join-Path $install 'Settings.json' if (Test-Path $settingsFile) { try { $s = Get-Content $settingsFile -Raw -Encoding UTF8 | ConvertFrom-Json if ($s.FrontRestEnabled -and $s.FrontRestFolder) { $icgFolders += $s.FrontRestFolder } if ($s.FrontRetailEnabled -and $s.FrontRetailFolder) { $icgFolders += $s.FrontRetailFolder } if ($s.ManagerEnabled -and $s.ManagerFolder) { $icgFolders += $s.ManagerFolder } } catch { } } function EftBusy { foreach ($folder in $icgFolders) { foreach ($name in @('REQUEST.TXT', 'RESPONSE.TXT')) { $file = Join-Path $folder $name if ((Test-Path $file) -and ((Get-Date) - (Get-Item $file).LastWriteTime).TotalSeconds -lt 120) { return $true } } } return $false } $waited = 0 while (EftBusy) { if ($waited -eq 0) { Say 'Υπάρχει συναλλαγή EFT σε εξέλιξη. Αναμονή να ολοκληρωθεί...' Yellow } Start-Sleep -Seconds 5 $waited += 5 if ($waited -ge 600) { throw 'Η συναλλαγή EFT δεν ολοκληρώθηκε σε 10 λεπτά. Δοκιμάστε ξανά αργότερα.' } } # ---- 5. Κλείσιμο, αντίγραφο ασφαλείας, αντικατάσταση -------------------------------- $processes = Get-Process TriasEftPosCon -ErrorAction SilentlyContinue | Where-Object { $_.Path -and ((Split-Path $_.Path) -eq $install) } if ($processes) { Log 'Κλείσιμο EftPosCon...' $processes | Stop-Process -Force $processes | ForEach-Object { $_.WaitForExit(30000) | Out-Null } Start-Sleep -Seconds 2 } $backup = Join-Path $install ("UpdateBackup\" + $oldVersion + "_" + (Get-Date -Format 'yyyyMMddHHmmss')) $written = New-Object System.Collections.ArrayList $archive = [IO.Compression.ZipFile]::OpenRead($zip) try { foreach ($entry in $archive.Entries) { if (-not $entry.Name -or $entry.Name -eq 'Settings.json') { continue } $relative = $entry.FullName.Replace('/', '\') $target = [IO.Path]::GetFullPath((Join-Path $install $relative)) if (-not $target.StartsWith($install, [StringComparison]::OrdinalIgnoreCase)) { continue } if (Test-Path $target) { $saved = Join-Path $backup $relative New-Item -ItemType Directory (Split-Path $saved) -Force | Out-Null Copy-Item $target $saved -Force } New-Item -ItemType Directory (Split-Path $target) -Force | Out-Null [IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $target, $true) [void]$written.Add($relative) } } catch { $archive.Dispose() Log ("Σφάλμα αντικατάστασης: " + $_.Exception.Message + ". Επαναφορά.") foreach ($relative in $written) { $saved = Join-Path $backup $relative; $target = Join-Path $install $relative if (Test-Path $saved) { Copy-Item $saved $target -Force } elseif (Test-Path $target) { Remove-Item $target -Force } } Start-Process $exe -WorkingDirectory $install throw } $archive.Dispose() Log "Αντικαταστάθηκαν $($written.Count) αρχεία. Εκκίνηση νέας έκδοσης..." # ---- 6. Εκκίνηση και έλεγχος -------------------------------------------------------- $app = Start-Process $exe -WorkingDirectory $install -PassThru if ($app.WaitForExit(30000)) { Log "Η νέα έκδοση έκλεισε αμέσως (κωδικός $($app.ExitCode)). Επαναφορά προηγούμενης." foreach ($relative in $written) { $saved = Join-Path $backup $relative; $target = Join-Path $install $relative if (Test-Path $saved) { Copy-Item $saved $target -Force } elseif (Test-Path $target) { Remove-Item $target -Force } } Start-Process $exe -WorkingDirectory $install Banner "ΑΠΟΤΥΧΙΑ - επαναφέρθηκε η έκδοση $oldVersion (δείτε $log)" Red return } Log "Η αναβάθμιση σε $newVersion ολοκληρώθηκε." Banner "ΕΠΙΤΥΧΙΑ - EftPosCon $newVersion" Green } catch { if ($log) { Log ('ΣΦΑΛΜΑ: ' + $_.Exception.Message) } Banner ('ΑΠΟΤΥΧΙΑ - ' + $_.Exception.Message) Red } }