diff --git a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor index f2e2e709..7ee95e30 100644 --- a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor +++ b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor @@ -26,7 +26,7 @@ - + diff --git a/Oqtane.Package/Oqtane.Framework.nuspec b/Oqtane.Package/Oqtane.Framework.nuspec index d02d4578..cf35e229 100644 --- a/Oqtane.Package/Oqtane.Framework.nuspec +++ b/Oqtane.Package/Oqtane.Framework.nuspec @@ -18,10 +18,11 @@ + + - - + \ No newline at end of file diff --git a/Oqtane.Server/Infrastructure/InstallationManager.cs b/Oqtane.Server/Infrastructure/InstallationManager.cs index efbed7c5..793e87a4 100644 --- a/Oqtane.Server/Infrastructure/InstallationManager.cs +++ b/Oqtane.Server/Infrastructure/InstallationManager.cs @@ -80,14 +80,10 @@ namespace Oqtane.Infrastructure // if compatible with framework version if (frameworkversion == "" || Version.Parse(Constants.Version).CompareTo(Version.Parse(frameworkversion)) >= 0) { - string name = ""; - if (folder != "Framework") - { - // module and theme packages must be in form of name.1.0.0.nupkg - name = Path.GetFileNameWithoutExtension(packagename); - string[] segments = name?.Split('.'); - if (segments != null) name = string.Join('.', segments, 0, segments.Length - 3); - } + // module and theme packages must be in form of name.1.0.0.nupkg + string name = Path.GetFileNameWithoutExtension(packagename); + string[] segments = name?.Split('.'); + if (segments != null) name = string.Join('.', segments, 0, segments.Length - 3); // deploy to appropriate locations foreach (ZipArchiveEntry entry in archive.Entries) diff --git a/Oqtane.Upgrade/Program.cs b/Oqtane.Upgrade/Program.cs index d10c9821..d8515e81 100644 --- a/Oqtane.Upgrade/Program.cs +++ b/Oqtane.Upgrade/Program.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Reflection; @@ -10,6 +11,11 @@ namespace Oqtane.Upgrade { static void Main(string[] args) { + // for testing purposes set Oqtane.Upgrade as startup project and modify values below + //Array.Resize(ref args, 2); + //args[0] = @"C:\yourpath\oqtane.framework\Oqtane.Server"; + //args[1] = @"C:\yourpath\oqtane.framework\Oqtane.Server\wwwroot"; + // requires 2 arguments - the contentrootpath and the webrootpath of the site if (args.Length == 2) { @@ -32,7 +38,7 @@ namespace Oqtane.Upgrade // take the app offline if (File.Exists(Path.Combine(webrootfolder, "app_offline.bak"))) { - File.Move(Path.Combine(webrootfolder, "app_offline.bak"), Path.Combine(contentrootfolder, "app_offline.htm")); + File.Copy(Path.Combine(webrootfolder, "app_offline.bak"), Path.Combine(contentrootfolder, "app_offline.htm"), true); } // get list of files in package @@ -41,26 +47,29 @@ namespace Oqtane.Upgrade { foreach (ZipArchiveEntry entry in archive.Entries) { - if (Path.GetExtension(entry.FullName) == ".dll") + switch (Path.GetDirectoryName(entry.FullName).Split('\\')[0]) { - files.Add(Path.GetFileName(entry.FullName)); + case "lib": + files.Add(Path.Combine(binfolder, Path.GetFileName(entry.FullName))); + break; + case "wwwroot": + files.Add(Path.Combine(webrootfolder, entry.FullName.Replace("wwwroot/", "").Replace("/","\\"))); + break; } } } // ensure files are not locked - string filename; - if (CanAccessFiles(files, binfolder)) + if (CanAccessFiles(files)) { // create backup foreach (string file in files) { - filename = Path.Combine(binfolder, Path.GetFileName(file)); - if (File.Exists(filename.Replace(".dll", ".bak"))) + if (File.Exists(file + ".bak")) { - File.Delete(filename.Replace(".dll", ".bak")); + File.Delete(file + ".bak"); } - File.Move(filename, filename.Replace(".dll", ".bak")); + File.Move(file, file + ".bak"); } // extract files @@ -71,10 +80,19 @@ namespace Oqtane.Upgrade { foreach (ZipArchiveEntry entry in archive.Entries) { - filename = Path.GetFileName(entry.FullName); + string filename = ""; + switch (Path.GetDirectoryName(entry.FullName).Split('\\')[0]) + { + case "lib": + filename = Path.Combine(binfolder, Path.GetFileName(entry.FullName)); + break; + case "wwwroot": + filename = Path.Combine(webrootfolder, entry.FullName.Replace("wwwroot/", "").Replace("/", "\\")); + break; + } if (files.Contains(filename)) { - entry.ExtractToFile(Path.Combine(binfolder, filename), true); + entry.ExtractToFile(filename, true); } } } @@ -91,29 +109,27 @@ namespace Oqtane.Upgrade // clean up backup foreach (string file in files) { - filename = Path.Combine(binfolder, Path.GetFileName(file)); - if (File.Exists(filename.Replace(".dll", ".bak"))) + if (File.Exists(file + ".bak")) { - File.Delete(filename.Replace(".dll", ".bak")); + File.Delete(file + ".bak"); } } + + // delete package + File.Delete(packagename); } else { // restore on failure foreach (string file in files) { - filename = Path.Combine(binfolder, Path.GetFileName(file)); - if (File.Exists(filename)) + if (File.Exists(file)) { - File.Delete(filename); + File.Delete(file); } - File.Move(filename.Replace(".dll", ".bak"), filename); + File.Move(file + ".bak", file); } } - - // delete package - File.Delete(packagename); } // bring the app back online @@ -126,7 +142,7 @@ namespace Oqtane.Upgrade } } - private static bool CanAccessFiles(List files, string folder) + private static bool CanAccessFiles(List files) { // ensure files are not locked by another process - the shutdownTimeLimit defines the duration for app shutdown bool canAccess = true; @@ -134,7 +150,7 @@ namespace Oqtane.Upgrade int i = 0; while (i < (files.Count - 1) && canAccess) { - string filepath = Path.Combine(folder, Path.GetFileName(files[i])); + string filepath = files[i]; int attempts = 0; bool locked = true; // try up to 30 times