190930
This commit is contained in:
115
Pilz.Updating.Updater/UpdateInstaller.vb
Normal file
115
Pilz.Updating.Updater/UpdateInstaller.vb
Normal file
@@ -0,0 +1,115 @@
|
||||
Imports System.IO
|
||||
Imports Newtonsoft.Json.Linq
|
||||
Imports Pilz.Updating.Model
|
||||
Imports Pilz.Updating.Scripts
|
||||
|
||||
Public Class UpdateInstaller
|
||||
|
||||
Private restartHostApplication As Boolean
|
||||
Private autoCloseHostApplication As Boolean
|
||||
Private packageDir As String
|
||||
Private appExePath As String
|
||||
|
||||
Private Sub UpdateInstaller_Shown(sender As Object, e As EventArgs) Handles Me.Shown
|
||||
CheckCommandLines()
|
||||
|
||||
If autoCloseHostApplication Then
|
||||
CloseHostApplication()
|
||||
End If
|
||||
|
||||
InstallUpdates()
|
||||
|
||||
If restartHostApplication Then
|
||||
StartHostApplication()
|
||||
End If
|
||||
End Sub
|
||||
|
||||
Private Sub CloseHostApplication()
|
||||
Dim myProcesses As New List(Of Process)
|
||||
|
||||
For Each p As Process In Process.GetProcesses
|
||||
If p.MainModule.FileName = appExePath Then
|
||||
myProcesses.Add(p)
|
||||
End If
|
||||
Next
|
||||
|
||||
For Each p As Process In myProcesses
|
||||
p.Close()
|
||||
Next
|
||||
|
||||
Dim waited As Byte = 5
|
||||
Do While myProcesses.Where(Function(n) Not n.HasExited).Any AndAlso waited > 0
|
||||
Sleep(1000)
|
||||
waited -= 1
|
||||
Loop
|
||||
|
||||
For Each p As Process In myProcesses
|
||||
If Not p.HasExited Then
|
||||
p.Kill()
|
||||
End If
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Private Sub StartHostApplication()
|
||||
Process.Start(appExePath)
|
||||
End Sub
|
||||
|
||||
Private Sub CheckCommandLines()
|
||||
For Each cmd As String In My.Application.CommandLineArgs
|
||||
Dim splitted As String() = cmd.Split("#")
|
||||
|
||||
If splitted.Length = 2 Then
|
||||
Select Case splitted(0).ToLower
|
||||
Case "restartHostApp".ToLower
|
||||
restartHostApplication = splitted(1)
|
||||
Case "autoCloseHostApp".ToLower
|
||||
autoCloseHostApplication = splitted(1)
|
||||
Case "updatePackage".ToLower
|
||||
packageDir = splitted(1)
|
||||
Case "applicationPath"
|
||||
appExePath = splitted(1)
|
||||
End Select
|
||||
End If
|
||||
Next
|
||||
End Sub
|
||||
|
||||
Private Sub InstallUpdates()
|
||||
Dim packagePath As String = Path.Combine(packageDir, "package.json")
|
||||
Dim packageFilesDir As String = Path.Combine(packageDir, "files")
|
||||
Dim systemFilesDir As String = Path.GetDirectoryName(appExePath)
|
||||
|
||||
'Load update package
|
||||
Dim package As UpdatePackage = JObject.Parse(File.ReadAllText(packagePath)).ToObject(Of UpdatePackage)
|
||||
|
||||
'Execute ScriptBefore
|
||||
ExecuteScriptsWithPriority(ScriptPriority.Before, package.Scripts, systemFilesDir, packageFilesDir)
|
||||
|
||||
'Update Files
|
||||
For Each rFile As String In package.Fileupdates
|
||||
Dim packageFile As String = Path.Combine(packageFilesDir, rFile)
|
||||
Dim systemFile As String = Path.Combine(systemFilesDir, rFile)
|
||||
Dim systemFileDir As String = Path.GetDirectoryName(systemFile)
|
||||
|
||||
'Create destination directory if not exists
|
||||
If Not Directory.Exists(systemFileDir) Then
|
||||
Directory.CreateDirectory(systemFileDir)
|
||||
End If
|
||||
|
||||
'Copy package file to system file
|
||||
File.Copy(packageFile, systemFile, True)
|
||||
Next
|
||||
|
||||
'ExecuteScriptAfter
|
||||
ExecuteScriptsWithPriority(ScriptPriority.After, package.Scripts, systemFilesDir, packageFilesDir)
|
||||
End Sub
|
||||
|
||||
Private Sub ExecuteScriptsWithPriority(priority As ScriptPriority, scripts As IEnumerable(Of Script), applicationPath As String, updatePackagePath As String)
|
||||
For Each script As Script In scripts
|
||||
If script.Priority = priority Then
|
||||
Dim mgr As New ScriptManager(applicationPath, updatePackagePath)
|
||||
mgr.ExecuteScript(script)
|
||||
End If
|
||||
Next
|
||||
End Sub
|
||||
|
||||
End Class
|
||||
Reference in New Issue
Block a user