Merge pull request #4574 from zyhfish/task/display-upgrade-progress

display the upgrade progress.
This commit is contained in:
Shaun Walker 2024-08-28 21:22:08 -04:00 committed by GitHub
commit d718969cbd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 82 additions and 42 deletions

View File

@ -5,24 +5,30 @@
<meta name="viewport" content="width=device-width">
<title>Upgrade Framework</title>
<base href="/" />
<link rel="stylesheet" href="https://www.oqtane.net/css/app.css">
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="https://www.oqtane.net/css/app.css">
</head>
<body onload="forceWait()">
<body onload="refresh()">
<div>
<br /><br />
<h1 align="center">Please Wait... Upgrade In Progress...</h1>
<p align="center">(this process can take a few minutes... please be patient)</p>
</div>
<div class="app-progress-indicator"></div>
<div class="w-50 mx-auto mt-5">
<div class="progress" role="progressbar" aria-label="Basic example" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar progress-bar-striped progress-bar-animated [PROGRESSCLASS]" style="width: [PROGRESS]%"></div>
</div>
<div class="fs-6 fst-italic mt-1">
[STATUS]
</div>
</div>
<script>
function forceWait() {
setInterval(function () {
window.location.href = "/";
}, 120 * 1000);
function refresh() {
setTimeout(function () {
window.location.href = "/?reload";
}, 1000);
}
</script>
</body>
</html>
</html>

View File

@ -31,10 +31,6 @@ namespace Oqtane.Updater
if (Directory.Exists(deployfolder))
{
string log = "Upgrade Process Started: " + DateTime.UtcNow.ToString() + Environment.NewLine;
log += "ContentRootPath: " + contentrootfolder + Environment.NewLine;
log += "WebRootPath: " + webrootfolder + Environment.NewLine;
string packagename = "";
string[] packages = Directory.GetFiles(deployfolder, "Oqtane.Framework.*.Upgrade.zip");
if (packages.Length > 0)
@ -42,15 +38,27 @@ namespace Oqtane.Updater
packagename = packages[packages.Length - 1]; // use highest version
}
// create upgrade log file
var logFilePath = Path.Combine(deployfolder, $"{Path.GetFileNameWithoutExtension(packagename)}.log");
if (File.Exists(logFilePath))
{
File.Delete(logFilePath);
}
WriteLog(logFilePath, "Upgrade Process Started: " + DateTime.UtcNow.ToString() + Environment.NewLine);
WriteLog(logFilePath, "ContentRootPath: " + contentrootfolder + Environment.NewLine);
WriteLog(logFilePath, "WebRootPath: " + webrootfolder + Environment.NewLine);
if (packagename != "" && File.Exists(Path.Combine(webrootfolder, "app_offline.bak")))
{
log += "Located Upgrade Package: " + packagename + Environment.NewLine;
WriteLog(logFilePath, "Located Upgrade Package: " + packagename + Environment.NewLine);
log += "Stopping Application Using: " + Path.Combine(contentrootfolder, "app_offline.htm") + Environment.NewLine;
File.Copy(Path.Combine(webrootfolder, "app_offline.bak"), Path.Combine(contentrootfolder, "app_offline.htm"), true);
WriteLog(logFilePath, "Stopping Application Using: " + Path.Combine(contentrootfolder, "app_offline.htm") + Environment.NewLine);
var offlineTemplate = File.ReadAllText(Path.Combine(webrootfolder, "app_offline.bak"));
var offlineFilePath = Path.Combine(contentrootfolder, "app_offline.htm");
// get list of files in package with local paths
log += "Retrieving List Of Files From Upgrade Package..." + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 5, "Retrieving List Of Files From Upgrade Package");
WriteLog(logFilePath, "Retrieving List Of Files From Upgrade Package..." + Environment.NewLine);
List<string> files = new List<string>();
using (ZipArchive archive = ZipFile.OpenRead(packagename))
{
@ -59,15 +67,18 @@ namespace Oqtane.Updater
if (!string.IsNullOrEmpty(entry.Name))
{
files.Add(Path.Combine(contentrootfolder, entry.FullName));
WriteLog(logFilePath, "Check File: " + entry.FullName + Environment.NewLine);
}
}
}
bool success = true;
// ensure files are not locked
if (CanAccessFiles(files))
{
log += "Preparing Backup Folder: " + backupfolder + Environment.NewLine;
bool success = true;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 10, "Preparing Backup Folder");
WriteLog(logFilePath, "Preparing Backup Folder: " + backupfolder + Environment.NewLine);
try
{
// clear out backup folder
@ -79,14 +90,16 @@ namespace Oqtane.Updater
}
catch (Exception ex)
{
log += "Error Creating Backup Folder: " + ex.Message + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Error Creating Backup Folder", "bg-danger");
WriteLog(logFilePath, "Error Creating Backup Folder: " + ex.Message + Environment.NewLine);
success = false;
}
// backup files
if (success)
{
log += "Backing Up Files..." + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 15, "Backing Up Files");
WriteLog(logFilePath, "Backing Up Files..." + Environment.NewLine);
foreach (string file in files)
{
string filename = Path.Combine(backupfolder, file.Replace(contentrootfolder + Path.DirectorySeparatorChar, ""));
@ -99,12 +112,15 @@ namespace Oqtane.Updater
Directory.CreateDirectory(Path.GetDirectoryName(filename));
}
File.Copy(file, filename);
WriteLog(logFilePath, "Copy File: " + filename + Environment.NewLine);
}
}
catch (Exception ex)
{
log += "Error Backing Up Files: " + ex.Message + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Error Backing Up Files", "bg-danger");
WriteLog(logFilePath, "Error Backing Up Files: " + ex.Message + Environment.NewLine);
success = false;
break;
}
}
}
@ -112,7 +128,8 @@ namespace Oqtane.Updater
// extract files
if (success)
{
log += "Extracting Files From Upgrade Package..." + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 50, "Extracting Files From Upgrade Package");
WriteLog(logFilePath, "Extracting Files From Upgrade Package..." + Environment.NewLine);
try
{
using (ZipArchive archive = ZipFile.OpenRead(packagename))
@ -127,6 +144,7 @@ namespace Oqtane.Updater
Directory.CreateDirectory(Path.GetDirectoryName(filename));
}
entry.ExtractToFile(filename, true);
WriteLog(logFilePath, "Exact File: " + filename + Environment.NewLine);
}
}
}
@ -134,12 +152,14 @@ namespace Oqtane.Updater
catch (Exception ex)
{
success = false;
log += "Error Extracting Files From Upgrade Package: " + ex.Message + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Error Extracting Files From Upgrade Package", "bg-danger");
WriteLog(logFilePath, "Error Extracting Files From Upgrade Package: " + ex.Message + Environment.NewLine);
}
if (success)
{
log += "Removing Backup Folder..." + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 90, "Removing Backup Folder");
WriteLog(logFilePath, "Removing Backup Folder..." + Environment.NewLine);
try
{
// clean up backup
@ -149,12 +169,14 @@ namespace Oqtane.Updater
}
catch (Exception ex)
{
log += "Error Removing Backup Folder: " + ex.Message + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Error Extracting Files From Upgrade Package", "bg-warning");
WriteLog(logFilePath, "Error Removing Backup Folder: " + ex.Message + Environment.NewLine);
}
}
else
{
log += "Restoring Files From Backup Folder..." + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 50, "Upgrade Failed, Restoring Files From Backup Folder", "bg-warning");
WriteLog(logFilePath, "Restoring Files From Backup Folder..." + Environment.NewLine);
try
{
// restore on failure
@ -165,6 +187,7 @@ namespace Oqtane.Updater
if (File.Exists(filename))
{
File.Copy(filename, file);
WriteLog(logFilePath, "Restore File: " + filename + Environment.NewLine);
}
}
// clean up backup
@ -172,41 +195,38 @@ namespace Oqtane.Updater
}
catch (Exception ex)
{
log += "Error Restoring Files From Backup Folder: " + ex.Message + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Error Restoring Files From Backup Folder", "bg-danger");
WriteLog(logFilePath, "Error Restoring Files From Backup Folder: " + ex.Message + Environment.NewLine);
}
}
}
else
{
log += "Upgrade Failed: Could Not Backup Files" + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Upgrade Failed: Could Not Backup Files", "bg-danger");
WriteLog(logFilePath, "Upgrade Failed: Could Not Backup Files" + Environment.NewLine);
}
}
else
{
log += "Upgrade Failed: Some Files Are Locked By The Hosting Environment" + Environment.NewLine;
UpdateOfflineContent(offlineFilePath, offlineTemplate, 95, "Upgrade Failed: Some Files Are Locked By The Hosting Environment", "bg-danger");
WriteLog(logFilePath, "Upgrade Failed: Some Files Are Locked By The Hosting Environment" + Environment.NewLine);
}
UpdateOfflineContent(offlineFilePath, offlineTemplate, 100, "Upgrade Process Finished, Reloading", success ? "" : "bg-danger");
Thread.Sleep(3000); //wait for 3 seconds to complete the upgrade process.
// bring the app back online
if (File.Exists(Path.Combine(contentrootfolder, "app_offline.htm")))
{
log += "Restarting Application By Removing: " + Path.Combine(contentrootfolder, "app_offline.htm") + Environment.NewLine;
WriteLog(logFilePath, "Restarting Application By Removing: " + Path.Combine(contentrootfolder, "app_offline.htm") + Environment.NewLine);
File.Delete(Path.Combine(contentrootfolder, "app_offline.htm"));
}
}
else
{
log += "Framework Upgrade Package Not Found Or " + Path.Combine(webrootfolder, "app_offline.bak") + " Does Not Exist" + Environment.NewLine;
WriteLog(logFilePath, "Framework Upgrade Package Not Found Or " + Path.Combine(webrootfolder, "app_offline.bak") + " Does Not Exist" + Environment.NewLine);
}
log += "Upgrade Process Ended: " + DateTime.UtcNow.ToString() + Environment.NewLine;
// create upgrade log file
string logfile = Path.Combine(deployfolder, Path.GetFileNameWithoutExtension(packagename) + ".log");
if (File.Exists(logfile))
{
File.Delete(logfile);
}
File.WriteAllText(logfile, log);
WriteLog(logFilePath, "Upgrade Process Ended: " + DateTime.UtcNow.ToString() + Environment.NewLine);
}
else
{
@ -269,5 +289,19 @@ namespace Oqtane.Updater
}
return canAccess;
}
private static void UpdateOfflineContent(string filePath, string contentTemplate, int progress, string status, string progressClass = "")
{
var content = contentTemplate
.Replace("[PROGRESS]", progress.ToString())
.Replace("[PROGRESSCLASS]", progressClass)
.Replace("[STATUS]", status);
File.WriteAllText(filePath, content);
}
private static void WriteLog(string logFilePath, string logContent)
{
File.AppendAllText(logFilePath, $"[{DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff")}] {logContent}");
}
}
}